无法理解模板类中的友元函数

ash*_*shr 3 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>
void print(D<T> obj)
{std::cout<<sizeof(T);};


int main()
{
    D <char>obj3;
    print(obj3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或换句话说为什么以下不运行?

template <class T>
class D
{
    public :
    friend void print(D <T> obj);
};
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

根据[temp.friend],您必须提供显式模板参数,以使模板函数专门化为朋友:

template <class T>
class D
{
    public :
    friend void print<T>(D <T> obj);
};
Run Code Online (Sandbox Code Playgroud)

没有它,编译器将寻找一个函数print(),而不是函数模板print().