Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法理解模板类中的友元函数_C++_Templates_Friend - Fatal编程技术网

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打印(D

obj)

我想这一定是一个原因。你能解释一下什么是显式模板参数吗?我无法从google正在打开的网站上真正了解它。@AshRj我会在调用时解释,因为这是最简单的,但它适用于所有引用函数模板的时候。让我们假设你定义了一个实例
D;
。调用
print()
时,可以显式提供tempalte参数:
print(d);
,也可以不提供它们,让编译器从上下文(此处,从参数)推断它们:
print(d);
。明确地提供它们意味着在尖括号中列出它们
。谢谢你的解释。我明白你的意思,但我仍然无法理解这是如何解释你的答案的。你能告诉我哪里可以读到模板是如何工作的吗?我想这里的主要问题是我不明白模板是如何工作的在我的回答中,显式的参数是
打印(
)中的
。我不知道我能推荐什么参考,但这里有一个列表,所以,也许你可以从那里开始工作。[临时朋友]在我的回答中提到了C++11ISO标准。
template <class T>
class D
{
    public :
    friend void print<T>(D <T> obj);
};