2012-04-19 69 views
4

我有一个<运算符重载的问题。 我有这个类:C++运算符<overloading

WordEntry.h:

class WordEntry 
{ 
public: 
    WordEntry(string word); 
    ~WordEntry(); 

    bool operator<(const WordEntry otherWordEntry); 

    string getWord(); 

private: 
    string _word; 
}; 

WordEntry.cpp(我删除构造&析构函数):

string WordEntry::getWord() 
{ 
    return _word; 
} 


bool WordEntry::operator<(WordEntry otherWordEntry) 
{ 
    return lexicographical_compare(_word.begin(),_word.end(),otherWordEntry.getWord().begin(),otherWordEntry.getWord().end()); 
} 

一切都很好,当我在主要使用它.cpp那样:

WordEntry w1("Der"); 
    WordEntry w2("das"); 

    if (w1.operator<(w2)) { 
     cout << "w1 > w2"; 
    } 
    else 
    { 
     cout << "w2 > w1"; 
    } 

但是当我打电话给sort()vectorWordEntry对象,我会得到错误信息

无效操作数的二进制表示( '常量WordEntry' 和 '常量 WordEntry')

并将其指向​​。

有没有人知道这里发生了什么?

+0

'const'复制几乎失败的目的... – AJG85 2012-04-19 18:43:53

回答

7

现在<的参数是const,但成员不是。这意味着一个<之间的对比将会失败,因为它不能绑定到<。你需要让会员和参数都const

bool operator<(const WordEntry& otherWordEntry) const; 

bool WordEntry::operator<(const WordEntry& otherWordEntry) const { 
    ... 
} 

注:由于在评论中指出,你也应该参考

+2

通过引用传递也是一个好主意。 – juanchopanza 2012-04-19 18:46:24

+0

@juanchopanza好点,已更新 – JaredPar 2012-04-19 18:49:03

+0

就是这样,谢谢 – LeonS 2012-04-19 18:51:05

2

使用右值const引用传递WordEntry,使方法常量来保证编译器不会改变对象。

bool operator<(const WordEntry& otherWordEntry) const 
{ 
    // comparison 
} 

您也不需要显式调用操作符。 曾经为WordEntry对象,你可以做到这一点定义:既然你不使用自定义的比较谓词你可以只使用

if (w1 < w2) { // etc } 

std::string::operator<

return _word < otherWordEntry._word; 

大卫使得在返回一个很好的点内部成员的价值。如果你想使用lexicographical_compare与访问者,而不是_word成员直接(它可以如你在类范围内是),那么你应该定义它像这样:

const string& getWord() const { return _word; } 
2
string WordEntry::getWord() 
bool WordEntry::operator<(WordEntry otherWordEntry) 
{ 
    return lexicographical_compare(_word.begin(), 
            _word.end(), 
            otherWordEntry.getWord().begin(), 
            otherWordEntry.getWord().end()); 
} 

getWord成员函数创建内部成员属性的副本并返回副本。连续两次调用getWord将返回具有相同内容的两个不同std::string实例,但它们是不同的对象。 lexicographical_compare函数要求第一个和第二个参数是迭代器到同一个容器,类似的第三个和第四个参数。在你的情况下,你正在传递迭代器到不同的容器(字符串),它将在函数内部进行比较,并会产生未定义的行为。

最简单的解决方案是具有getWord返回一个const参照内部std::string,以这种方式,迭代器将都是指在右手侧对象的内部对象。

正如其他人也提到,你应该通过WordEntry通过const参考,并operator<const,以提高的代码。但是在你的实现中的问题是来自不同容器的迭代器的混合。