2013-05-13 2 views
0

Я делаю некоторый тест на hash_map, используя struct as key. Я определяю-структуру:Почему оператор <определяется как не являющийся членом?

struct ST 
{ 

    bool operator<(const ST &rfs) 
    { 
     return this->sk < rfs.sk; 
    } 

    int sk; 
}; 

и:

size_t hash_value(const ST& _Keyval) 
{ // hash _Keyval to size_t value one-to-one 
    return ((size_t)_Keyval.sk^_HASH_SEED); 
} 

затем:

stdext::hash_map<ST, int> map; 
ST st; 
map.insert(std::make_pair<ST, int>(st, 3)); 

Это дает мне ошибку компилятора: двоичную '<': ни один оператор не найден, который занимает левую руку операнд типа «const ST» (или нет приемлемого преобразования)

Итак, я меняю оператор t o не является членом:

bool operator<(const ST& lfs, const ST& rfs) 
{ 
    return lfs.sk < rfs.sk; 
} 

Это нормально. Так что я хочу знать, почему?

ответ

4

Вы пропускали const:

bool operator<(const ST &rfs) const 
{ 
    return this->sk < rfs.sk; 
} 
+0

Да, я проверяю место, где выдается ошибка. Оператор bool() (const _Ty & _Left, const _Ty & _Right) const '. Конечно, я скучаю по созвездию. –

+0

@MIKU_LINK: Да, это необходимо для вызова оператора на объект 'const ST'. –

+0

Спасибо! @Jesse Хорошо –

0

Я считаю, что проблема заключается в

ошибка: бинарная «<»: ни один оператор не найден, который принимает левого операнда типа «константный ST» (или нет приемлемого преобразования)

Ваша функция-член bool operator<(const ST &rfs) объявлена ​​неконстантной, так что она не может быть вызвана против const ST.

Просто измените его bool operator<(const ST &rfs) const и он должен работать

0

Несмотря на вышеуказанных ответов, я рекомендую вам взглянуть на:

C++ Primer, четвертое издание, глава 14, раздел 14.1

Ordinarily we define the arithmetic and relational operators as nonmember functions and we define assignment operators as members:

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