在阅读C卷2中的Thinking时,从模板深度章节中,我看到如果你在模板类中有一个友好的函数,你需要转发声明该函数.我做了这个例子来测试它,重叠输出操作符:
#include <iostream>
using namespace std;
/*
template<class T>
class X;
template<class T>
ostream& operator << (ostream& os, const X<T>& x);
*/
template<class T>
class X {
T t;
public:
X(T i): t(i) {}
friend ostream& operator << (ostream& os, const X<T>& x)
{
return os << x.t;
}
};
int main()
{
X<int> a(1);
cout << a;
return 0;
}
但它没有前向声明就可以工作,但后来我用<
friend ostream& operator << <>(ostream& os, const X<T>& x); (inside of the class)
template<class T>
ostream& operator << (ostream& os, const X<T>& x)
{
return os << x.t;
}
我不确定为什么使用类中的定义它不适用,是因为你必须明确地说ostream操作符函数是模板吗? (使用<>)??
对困惑感到抱歉.
最佳答案 由于我的评论似乎令人满意,所以这里是一个答案的形式.
C FAQ Lite有a chapter on this,为了完整起见,归结为两种可能的方法来说服编译器在检查类X的主体时,友元函数运算符< 在类体内的朋友行中,给出了运算符的显着语法<< <>( 另一种方法是在类X的主体内定义友元模板函数的整个主体,这使得前向声明不必要.