对不起,如果这个问题已经全部回答了,但考虑到在模板类中重载此运算符,我已经阅读了很多问题,但我还没有发现像我这样的特殊情况。
这是我的代码:
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
template <typename T>
class Class
{
T x;
public:
friend ostream& operator << (const Class<T>&, ostream& out);
};
template <typename T>
ostream& operator << (const Class<T>&, ostream& out)
{
return (out << out.x << endl);
}
int main()
{
Class<short> object;
cout << object << endl;
}
我在最后一行收到此错误: 错误1错误C2679:二进制&#39;&lt;&lt;&#39; :找不到哪个操作符采用类型&#39;类&#39;的右手操作数。 (或者没有可接受的转换)g:\ ucenje \ objektno orijentirano programiranje \ template3 \ template3 \ main.cpp 25 1 template3
答案 0 :(得分:4)
operator<<
函数的参数已被切换,应该是例如
friend ostream& operator << (ostream& out, const Class<T>&1);
所有二元运算符的左侧始终是第一个参数,右侧是第二个参数。
答案 1 :(得分:4)
1. std::ostream
应该是operator<<
的第一个参数,所以
template <typename T>
ostream& operator << (const Class<T>&, ostream& out)
应该是
template <typename T>
ostream& operator << (ostream& out, const Class<T>& c)
2.您将operator<<
定义为模板函数,但friend ostream& operator << (const Class<T>&, ostream& out);
指向非模板函数,您应将其更改为
friend ostream& operator<< <T>(ostream& out, const Class<T>& c);
在声明类之前添加一些前向声明:
template <typename T>
class Class;
template <typename T>
ostream& operator << (ostream& out, const Class<T>& c);
或者您可以在类的定义中将operator<<
定义为非模板函数。
template <typename T>
class Class
{
T x;
public:
friend ostream& operator<< (ostream& out, const Class<T>& c)
{
out << c.x << endl;
return out;
}
};