c – 模板和朋友

在阅读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的主体内定义友元模板函数的整个主体,这使得前向声明不必要.

点赞