gpt4 book ai didi

c++ - 模板和 friend

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:07 26 4
gpt4 key购买 nike

在阅读 Thinking in C++ Volume 2 的“深度模板”一章时,我发现如果模板类中有一个友好的函数,则需要转发该函数的声明。我做了这个例子来测试这个,覆盖输出运算符:

#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 的主体时友元函数 operator<<实际上是一个函数模板。

一种方法是像您一样声明函数模板 operator<<在类定义之前并使用 <>在类主体内的 friend 行中,给出了 operator << <>( 的非凡语法.

另一种方法是在类 X 的函数体内定义友元模板函数的整个函数体,这样就不需要前向声明了。

关于c++ - 模板和 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5889843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com