在重载运算符中找不到错误<

时间:2016-05-12 12:42:17

标签: c++ makefile operator-overloading

我试图超载operator <以根据价格对房间进行分类。

以下是我的代码的相关部分:

class Room{
    protected:
        int roomNo;
        int category;
        Client client;
    public:
        Room();
        Room(int no, int cat, Client cl);
        void printData();
        int charge();
        Room operator < (Room &r1);
};

Room Room::operator < (Room &r1){
    if(this->charge() < r1.charge()){
        return r1;
    }
    else{
        return *this;
    }
}

但是当我尝试使用operator<时,编译器会给我以下错误:

main.cpp:(.text+0x2d8): undefined reference to `Room::operator<(Room const&)'
main.cpp:(.text+0x2ff): undefined reference to `Room::operator<(Room const&)'
[Error] ld returned 1 exit status
Makefile.win    recipe for target 'Ask01.exe' failed

为什么代码不能编译?

1 个答案:

答案 0 :(得分:4)

您的班级Room有一个签名为Room operator<(Room& r1)的成员功能。但是,这不是用作重载operator<的签名。将您的定义更改为

Room operator<(const Room& r1);

你的声明

Room Room::operator<(const Room& r1)
{
    /* code */
}

此外,将运算符重载为朋友非成员函数被认为是更好的做法(参见this question)。

另外,我会考虑将operator<的返回值更改为const Room&,以避免不必要的副本。

无论如何,为什么operator<的返回值不是bool?这可能会使某人感到困惑。

Room first, second;
if (first < second)
    doSomething(first);
else
    doSomething(second);

可能比简单(first < second).doSomething()长一点,但你的直觉肯定更清晰。

此外,如果您坚持将operator<定义为成员函数,我建议将其声明为const(如bool /*Room*/ operator<(const Room& r1) const;。您还必须声明为const {{1甚至可能int charge())。请详细了解const correctness