2014-04-29 134 views
0
_3DTocka operator<<(ostream& os, _3DTocka _3D){ 
    cout << "(" << _3D.x << "," << _3D.y << "," << _3D.z << ")" << endl; 
} 

以上是我的代码,它提供了一个错误: 它必须只有一个参数(1号线)错误重载运算符时<<

_3DTocka是类的名称..

+0

你声明'运营商<<'作为类的成员函数? –

+0

@πάνταῥεῖ我没有..我该怎么做? – user3402189

+0

其实,是的,它在课堂上,在公共部分。 (在第一篇文章中的代码) – user3402189

回答

5

三个问题:首先你声明函数是错误的,它应该返回它接收的ostream引用作为第一个参数。然后它不使用该参数ostream,但硬编码为cout。第三,它不会返回任何东西,这将导致undefined behavior

关于您的实际编译错误,您最有可能将该函数定义为该类中的成员函数。定义为类成员的输出运算符与定义为独立函数的输出运算符完全不同:当声明为成员函数时,它应该带有一个参数,并且它是将值输出到对象的值。如果它是一个独立函数(或者在类中定义为friend),那么它用于输出作为第二个参数传递的对象“to”作为第一个参数传递的对象。


关于错误:

friend ostream& operator<<(ostream& os, _3DTocka _3D) { 
    return os << '(' << _3D.x << ',' << _3D.y << ',' << _3D.z << ')'; 
} 

的几个注意事项: *我所做的字符串文字到字符文字。处理字符串比处理单个字符更有效 *我现在使用提供的输出流,这意味着您可以使用这个任何类型的输出流(如文件) *我已经删除了endl,这不是必需的并应由该功能的“调用者”提供。

现在你可以做

_3DTocka o = ...; 

cout << o << endl; 
+0

我把它作为'friend ostream&operator <<(ostream&os,_3DTocka _3D){'现在它就起作用了。感谢您的更正。另外,我不明白关于返回任何东西的部分?在课堂上,老师从来没有提到它必须返回一些东西,他只是给了我们一个类似的例子与cout。 – user3402189

+0

@ user3402189该函数没有被声明为返回'void',实际上它*必须*返回作为第一个对象传递的流引用,否则会产生意外的崩溃。看到我更新的答案。 –