C ++重载运算符<<让我做恶梦

时间:2014-01-16 11:12:41

标签: c++ class operator-overloading

我查看了与我的问题相关的所有其他线程,例如:

Overloading the << operator

operator << overload

我觉得我很接近解决我的问题,但没有成功。我希望你们能帮忙。

我有以下示例代码,我需要让他编译:

auto fan3 = std::make_shared<Fan>(3,"Not Connected");

//.... lots of code

std::cout << "User: " << *fan3 << " not connected" << std::endl;

我收到错误“无效的操作数到二进制表达式('basic_ostream&gt;'和'mtm :: Fan')”,所以我想我需要实现&lt;&lt;操作

我试着把以下内容放在fan.h中:

friend std::ostream& operator<<(std::ostream& os, Fan& fan);

但是我得到了“未定义的符号”。把它放在课堂之外(没有'朋友'的课程)导致同样的错误。

我想有一些我对这种行为我不太了解的东西 - 我确实实现了其他运算符重载,但是&lt;&lt;到目前为止只是给我带来麻烦。

请向我解释我错过了什么,以及如何解决这个问题。 谢谢你的时间!

3 个答案:

答案 0 :(得分:3)

您需要声明一个这样的自由函数:

std::ostream& operator<<(std::ostream& os, const Fan& fan);

然后实现它,就像这样:

std::ostream& operator<<(std::ostream& os, const Fan& fan)
{
    return os << fan.whatever;
}

如果您的类位于命名空间中,而不是在类本身内,则应该在类的命名空间中完成。

答案 1 :(得分:0)

你必须添加一个函数的实现,你得到未定义的符号错误,因为没有声明的实现。你需要这样的东西:

std::ostream& operator<<(std::ostream& os, Fan const& fan) {
                                                ^^^ add this also to 
                                                    bind to temporaries
    /* and output what is needed, i.e name of the Fan if it exists */
    return os << fan.name;
}

您必须确保在正确的命名空间中声明和定义此功能。


朋友关键字

只有在您想要输出类

的私有成员时才需要这样做

答案 2 :(得分:0)

#include <iostream>

class Fan {
    public:
        int value;
    Fan (int _v):value(_v){};
};

std::ostream& operator<<(std::ostream& os, const Fan& fan)
{
    return os << fan.value;
}

int main(void){
    Fan *f = new Fan(5);
    std::cout << "val: " << *f << std::endl;

return 0;
}

这是一个有效的例子