2015-01-02 2 views
0

저는 연산자 오버로딩을 배우는 중이며 세트에 내 사용자 정의 클래스의 두 정점을 추가하려고합니다. 이로 인해 이상한 오류가 발생하고 < 오버로딩 시도가 작동하지 않습니다.연산자에 문제가 발생했습니다. <C++에서 오버로드가 발생했습니다.

누군가가 잘못 설명 할 수 있습니까?

Vertex 클래스 :

class Vertex{             
public: 
    int i, j; 
    set<Vertex> adj; //adjacent vertices 

    Vertex(){ 
     i = j = -1; 
    } 
    ~Vertex(){ 
     adj.clear(); 
    } 
    //end constructors and destructors 

    void setPos(int row, int col){ 
     i = row; 
     j = col; 
    }//end setPos() 

    /** must overload for set<Vertex> to function */ 
    bool operator < (const Vertex &o){ 
     if(i < o.i) 
      return true; 
     if(i > o.i) 
      return false; 
     return j < o.j; 
    } 

};//END class Vertex 

그러나 주요 터미널에서 이상한 출력을 발생시키고 오류가이 함수를 호출 :

/** connect v1 and v2 such that they are adjacent */ 
void addEdge(Vertex v1, Vertex v2){ 
    v1.adj.insert(v2); 
    v2.adj.insert(v1); 
}//END addEdge() 

오류 :

In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\string:48:0, 
       from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\locale_cla 
sses.h:40, 
       from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\ios_base.h 
:41, 
       from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ios:42, 
       from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream:38, 
       from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\iostream:39, 
       from FileMaze.cc:2: 
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_function.h: In instantiation 
of 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = V 
ertex]': 
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_tree.h:1321:11: required f 
rom 'std::pair<std::_Rb_tree_node_base*, std::_Rb_tree_node_base*> std::_Rb_tree 
<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_get_insert_unique_pos(const key_ 
type&) [with _Key = Vertex; _Val = Vertex; _KeyOfValue = std::_Identity<Vertex>; 
_Compare = std::less<Vertex>; _Alloc = std::allocator<Vertex>; std::_Rb_tree<_K 
ey, _Val, _KeyOfValue, _Compare, _Alloc>::key_type = Vertex]' 
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_tree.h:1374:47: required f 
rom 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _Ke 
yOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = Vertex; 
_Val = Vertex; _KeyOfValue = std::_Identity<Vertex>; _Compare = std::less<Vertex 
>; _Alloc = std::allocator<Vertex>]' 
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_set.h:463:29: required fro 
m 'std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, 
typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Com 
pare, _Alloc>::insert(const value_type&) [with _Key = Vertex; _Compare = std::le 
ss<Vertex>; _Alloc = std::allocator<Vertex>; typename std::_Rb_tree<_Key, _Key, 
std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_ite 
rator = std::_Rb_tree_const_iterator<Vertex>; std::set<_Key, _Compare, _Alloc>:: 
value_type = Vertex]' 
FileMaze.cc:47:18: required from here 
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_function.h:235:20: error: pa 
ssing 'const Vertex' as 'this' argument of 'bool Vertex::operator<(const Vertex& 
)' discards qualifiers [-fpermissive] 
     { return __x < __y; } 
        ^

합니다 ** * [FileMaze.o] 오류 1

+0

"을하고 오류가"당신이하지 않으면 우리에게 도움이되지 않습니다 ** 오류 ** **를 알려주십시오. (좋은 스타일로 쓰려면 BTW,'<'연산자는 실제로'const'이어야합니다 ...) –

+0

출력은 무엇입니까? 어떤 오류입니까? – japreiss

+0

편집 됨 오류가 표시됩니다. – Kolibrie

답변

2

operator< 함수는 const 멤버 함수 여야합니다. 변경하려면

bool operator < (const Vertex &o) const; 
0

this page of c++ FAQ을 확인하는 것이 좋습니다.

사실 당신이 Less operator 같은 기능을 오버로드 할 때, 당신은 객체를 변경하지 않고, 그래서 그것은 그 const member function으로 과부하가 될 것으로 예상된다에서 :

bool operator < (const Vertex &o) const { 
            ^~~~~ 
    } 
관련 문제