2012-11-27 2 views
0

"여기에서 인스턴스화되었습니다"라는 문제에 대해 많은 스레드가 있습니다. 그들은 모두 기본 생성자를 잊어 버린 사람들로 보입니다. 나는 내 문제가 다르다고 생각한다. (C++을 처음 접했을 때 같은 문제에 약간의 변형이있을 수 있었고 솔루션을 구현하는 방법을 모른다.)여기에서 인스턴스화 된 C++은 std :: set에서 오류가 발생했습니다.

세트에 삽입하려고하고 있는데 분명히 거기에서 인스턴스화 중입니다. 그리고 그것은 오류를 던지고 있습니다.

class Node{ 
public: 
bool operator <(const Node& other){ 
    return id < other.id; 
} 
class Graph { 
public: 
    int poner; 
    map<string, Node> nodeMap; 
    set<Node> reachables; 


    void DepthFirstSearch(Node node){ 
     reachables.clear(); //fine at this point 
     poner = 0; 
     DFS(node); 
    } 


    private: 
     void DFS(Node node){ 
      reachables.insert(node); //instantiated from here 
     } 

    }; 


Node.h:131:25: instantiated from here 
c:\..... errir: passing 'const Node' as 'this' argument of 'bool Node::operator<(const Node&)' discards qualifiers [-fpermissive] 

언제나 감사드립니다.

+2

오류 메시지를 보내주세요. 당신은 그것의 작은 부분을 게시했습니다. – chris

+5

"여기서부터 인스턴스화"는 오류가 아닙니다. 진단 적입니다. 템플릿 오류가 발생하면 템플릿 정의와 사용에 대한 정보를 얻는 것이 도움이됩니다. 'Node'에'operator <'가 있습니까? 'std :: set'은 비교 연산이 필요합니다. – zch

+0

zch, 그건 아마 내 문제입니다 ... 나는 <연산자가 없습니다. 나는 내가 집에 갈 때 그것을 점검 할 것이다. –

답변

1

어딘가에 const Nodeconst Node을 비교하려고합니다. operator<const으로 표시되지 않았으므로 실패합니다.

operator<(const Node& other) const {} 
          ^^^^^ 

표준 라이브러리는 비교가 논리적으로는 const 일 것으로 예상합니다. 만약 그들이 실제로 const 일 수 없다면, mutable을 사용하여 조작자가 돌연변이를하고 있다는 것을 숨길 수 있습니다.하지만 이것이 정말로 외부에서 보이지 않는지 확인하십시오.

오류 메시지 : instantiated from here은 실제로이 코드가 오류가 발생하는 템플릿을 인스턴스화하는 것을 의미합니다. 진짜 오류는 아니지만 인스턴스화 역 추적의 일부입니다. 실제 오류는 일반적으로 단어 error 다음에 (gcc로) 표시 될 수 있습니다.

관련 문제