C ++ ostream重载不起作用

时间:2015-11-18 09:31:34

标签: c++ operator-overloading operators iostream

修改

经过一些评论后,这是我的代码,现在是THIS链接。(更好,但我仍然有错误)

离婚:

ostream& operator<<(ostream& out, Device& v) {
    out << "Device " << v.get_name() << " Has an ID of: " << v.get_id();
    return out;
}

内部设备类:

friend ostream& operator<<(ostream& os, const Device& v);

我的电话:(设备类型为Node,val返回设备)

cout << device->val << endl;

我的错误:

  

错误LNK2019未解析的外部符号   “class std :: basic_ostream&gt;   std :: char_traits&gt; &安培; __cdecl运算符&lt;&lt;(类   std :: basic_ostream&gt; &amp;,类Device   const&amp;)“   (?? 6 @ YAAAV?$ basic_ostream @ DU?$ char_traits @ d @ STD @@@ STD @@ @ AAV01 @@@ ABVDevice Z)   在函数“void __cdecl print_devices(class Node *)”中引用   (?print_devices @@ YAXPAV?$节点@ VDevice @@@@@ Z)

原始

我被告知过载运算符是这样的:

ostream& Device::operator<<(ostream &out) {
    out << "Device " << this->name << " Has an ID of: " << this->id;
    return out;
}

但是当试图使用这个重载时 - (设备是类型设备)

cout << device << endl;

它标记为阅读并说 -

  

错误C2679二进制'&lt;&lt;':找不到右侧的操作符   “设备”类型的操作数(或没有可接受的转换)

为什么我会收到此错误,我该如何解决?我在网上看了,但找不到一个在课堂上运作的方法,只有这个:

  朋友ostream&amp;运营商LT;&LT; (ostream&amp; out,Point&amp; cPoint);

这对我也不起作用。

3 个答案:

答案 0 :(得分:2)

您在Device课程中声明的内容是

friend ostream& operator<<(ostream& os, const Device& v);

但是你提供的实现是

ostream& operator<<(ostream& out, Device& v) {
    out << "Device " << v.get_name() << " Has an ID of: " << v.get_id();
    return out;
}

不一样!你告诉编译器有一个friend函数,它引用ostream const 引用Device - 但是你提供的函数遗漏了const前面的Device

答案 1 :(得分:0)

Overloading C++ STL methods

我不相信你可以重载&lt;&lt;基于此答案的STL流上的运算符。

答案 2 :(得分:0)

您发布的错误是关于编译器未找到函数实现的。

#include <iostream>

struct MyType
{
    int data{1};

};

std::ostream& operator<< (std::ostream& out, const MyType& t)
{
    out << t.data;
    return out;
}

int main()
{
    MyType t;

    std::cout << t << std::endl;

    return 0;
}