加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读