我查看了与我的问题相关的所有其他线程,例如:
我觉得我很接近解决我的问题,但没有成功。我希望你们能帮忙。
我有以下示例代码,我需要让他编译:
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;到目前为止只是给我带来麻烦。
请向我解释我错过了什么,以及如何解决这个问题。 谢谢你的时间!
答案 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;
}
这是一个有效的例子