3

我有以下运算符重载原型:

 ostream& operator<<(ostream & outputstream, my_arr& arr)

 my_arr operator+(const my_arr& left, const my_arr& right)

我打电话:

 cout << (arr1 + arr2);

这给了我以下编译器错误:

error: no match for ‘operator<<’ in ‘std::cout << operator+(const my_array&, const my_array&)((*(const my_array*)(& y)))’

如果我将 << 的签名更改为以下内容,这就会消失:

  ostream& operator<<(ostream & outputstream, const my_arr& arr)

我可能在这里遗漏了一些基本的东西,但为什么会发生这种情况?谢谢你的帮助。

4

3 回答 3

4

问题是,当作为引用传递时,您不能传递“临时”(右值)对象,例如加法的结果。当传递一个 const 引用时,C++ 规则允许传递临时变量,因为它保证它们不会被写入。

于 2013-01-18T06:42:14.633 回答
2

如前所述,其结果是临时的(右值)。您还可以提供具有以下形式的输出操作的重载:

ostream& operator<<(ostream& outputstream, my_arr&& arr);

然后cout << (arr1 + arr2);将使用。

于 2013-01-18T06:50:11.963 回答
1

因为您也有错字,所以operator+您需要传递const my_arroperator

my_array operator+(const my_arr& left, const my_arr& right)
^^^^ should be my_arr                   ^^^ need to be const

或者你必须operator<<超载my_array

ostream& operator<<(ostream & outputstream, my_arr& arr)

否则,代码只会编译并运行正常:示例链接

于 2013-01-18T07:19:51.933 回答