4

我在重载 < 运算符时遇到问题。我有这堂课:

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());
}

当我像这样在 main.cpp 中使用它时,一切都很好:

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

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

但是当我用对象调用sort()时,我会收到错误消息vectorWordEntry

二进制表达式的无效操作数(“const WordEntry”和“const WordEntry”)

它指向stl_algo.h

有谁知道这里发生了什么?

4

3 回答 3

7

现在的论点<是 const 但成员不是。这意味着<2 个对象之间的比较const WordEntry&将失败,因为它无法绑定到<. 您需要同时使成员和参数const

bool operator<(const WordEntry& otherWordEntry) const;

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

注意:正如评论中指出的,您还应该WordEntry通过引用传递

于 2012-04-19T18:44:26.450 回答
2

对右值使用 const 引用并使方法 const 向编译器保证您不会更改对象。

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

您也不需要显式调用操作员。为对象定义后,WordEntry您可以执行以下操作:

if (w1 < w2) { // etc }

由于您没有使用自定义比较谓词,因此您可以使用std::string::operator<

return _word < otherWordEntry._word;

David 在按价值返回内部成员方面提出了一个很好的观点。如果您想直接使用lexicographical_compare访问器而不是_word成员(可以在类范围内),那么您应该像这样定义它:

const string& getWord() const { return _word; }
于 2012-04-19T18:45:03.857 回答
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对 internal 的引用std::string,这样,迭代器都将引用右侧对象中的内部对象。

正如其他人也提到的那样,您应该通过WordEntry引用const传递,并且operator<应该是const,以改进代码。但是您实现中的问题是来自不同容器的迭代器的混合。

于 2012-04-19T18:58:48.437 回答