c – 模板和朋友
发布时间:2020-12-16 07:25:21 所属栏目:百科 来源:网络整理
导读:在阅读C卷2中的Thinking时,从模板深度章节中,我看到如果你在模板类中有一个友好的函数,你需要转发声明该函数.我做了这个例子来测试它,重叠输出操作符: #include iostreamusing namespace std;/*templateclass Tclass X;templateclass Tostream operator (os
在阅读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的主体内定义友元模板函数的整个主体,这使得前向声明不必要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |