2012-06-03 8 views
3

У меня есть класс, определенный, как показано ниже. Среди прочего, у него есть оператор сравнения <.Ошибка компиляции при перегрузке оператора при сортировке вектора

class DictionarySearchItem { 

public: 

    DictionarySearchItem(); 
    double relevance() const; 
    bool operator<(const DictionarySearchItem& item) { return relevance() > item.relevance(); } 

}; 

typedef std::vector<DictionarySearchItem> DictionarySearchItemVector; 

Я тогда использовать класс таким образом:

DictionarySearchItemVector searchItems; 

for (unsigned i = 0; i < entries.size(); i++) { 
    // ... 
    // ... 
    DictionarySearchItem item; 
    searchItems.push_back(item); 
} 

Однако, когда я пытаюсь отсортировать вектор:

std::sort(searchItems.begin(), searchItems.end()); 

Я получаю следующее сообщение об ошибке компиляции с MinGW.

/usr/include/c++/4.2.1/bits/stl_algo.h:91: erreur : passing 'const hanzi::DictionarySearchItem' as 'this' argument of 'bool hanzi::DictionarySearchItem::operator<(const hanzi::DictionarySearchItem&)' discards qualifiers 

Я не совсем понимаю, что не соответствует моему коду, и сообщение об ошибке мне не понятно. Тот же код отлично компилируется с MSVC2008. Любая идея, что может быть проблемой?

+0

Я получил объяснение этого неправильно в первый раз. Я обновил свой ответ. Надеюсь, теперь это становится яснее. – juanchopanza

ответ

5

Вам нужно сделать менее чем оператор const:

bool operator<(const DictionarySearchItem& item) const { ... } 
               ^

Причина, вероятно, что sort опирается на тот факт, что сравниваемые элементы не могут изменяться в результате сравнения. Это может быть реализовано путем сравнения обеих сторон сравнения <, что означает, что оператор должен быть const, а также аргументом.

+0

Я не получаю объяснений. Разве мы не можем без проблем вызвать метод const из неконстантного метода? – AbdullahC

+0

@ Гиппо, конечно, вы можете. Я плохой, сегодня я сплю. – juanchopanza

+0

OK..cool. Тогда какое настоящее объяснение? :) – AbdullahC

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