C++ 无法理解模板类中的友元函数
这是我为理解这个概念而编写的代码。代码很好,可以运行 我不明白的是,为什么需要标记线C++ 无法理解模板类中的友元函数,c++,templates,friend,C++,Templates,Friend,这是我为理解这个概念而编写的代码。代码很好,可以运行 我不明白的是,为什么需要标记线 template <class T> class D { public : template <class P> //<------------------Why is this needed ? -------------- friend void print(D <P> obj); }; template <class T>
template <class T>
class D
{
public :
template <class P> //<------------------Why is this needed ? --------------
friend void print(D <P> obj);
};
template <class T>
void print(D<T> obj)
{std::cout<<sizeof(T);};
int main()
{
D <char>obj3;
print(obj3);
return 0;
}
模板
D类
{
公众:
template/根据[temp.friend],必须提供明确的模板参数,以使模板函数的专业化成为朋友:
template <class T>
class D
{
public :
friend void print<T>(D <T> obj);
};
模板
D类
{
公众:
朋友无效打印(D obj);
};
没有它,编译器将查找函数print()
,而不是函数模板print()
,该行显示print())
本身就是一个模板
函数。为什么类中需要这样做?模板函数在类外有一个完整的定义,加上实例化是在了解数据类型的情况下完成的。根据模板函数的语法,在声明模板函数之前,必须这样编写…template-friend-void打印(Dobj)
我想这一定是一个原因。你能解释一下什么是显式模板参数吗?我无法从google正在打开的网站上真正了解它。@AshRj我会在调用时解释,因为这是最简单的,但它适用于所有引用函数模板的时候。让我们假设你定义了一个实例D;
。调用print()
时,可以显式提供tempalte参数:print(d);
,也可以不提供它们,让编译器从上下文(此处,从参数)推断它们:print(d);
。明确地提供它们意味着在尖括号中列出它们
。谢谢你的解释。我明白你的意思,但我仍然无法理解这是如何解释你的答案的。你能告诉我哪里可以读到模板是如何工作的吗?我想这里的主要问题是我不明白模板是如何工作的在我的回答中,显式的参数是打印(
)中的
。我不知道我能推荐什么参考,但这里有一个列表,所以,也许你可以从那里开始工作。[临时朋友]在我的回答中提到了C++11ISO标准。
template <class T>
class D
{
public :
friend void print<T>(D <T> obj);
};