2012-11-27 1 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

«экземпляр отсюда» не является ошибкой. Это диагностика - при наличии ошибки шаблона полезно иметь информацию об определении и использовании шаблонов. У вас есть 'operator <' for 'Node'? 'std :: set' требует операции сравнения. – zch

+0

zch, это, наверное, моя проблема ... У меня нет оператора

ответ

1

Где-то что-то пытается сравнить const Node с const Node. Поскольку ваш operator< не отмечен const, это не удается.

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

Стандартная библиотека ожидает сравнения логически const. Если они действительно не могут быть const, используйте mutable, чтобы скрыть, что оператор выполняет мутацию, но убедитесь, что это действительно не видно снаружи.

В сообщении об ошибке: instantiated from here действительно просто означает, что этот кусок кода отвечает за создание экземпляра шаблона, в котором происходит ошибка. Это не настоящая ошибка, а часть обратной последовательности. Ошибка real, как правило, (в gcc), содержащаяся после слова error, так же очевидно, как это может звучать.

Смежные вопросы