这是我为了解这个概念而编写的代码。代码很好,它运行。
我不明白为什么需要标记的线?
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;
}
或换句话说为什么以下不能运行?
template <class T>
class D
{
public :
friend void print(D <T> obj);
};
答案 0 :(得分:5)
根据[temp.friend],您必须提供显式模板参数,以使模板函数专业化为朋友:
template <class T>
class D
{
public :
friend void print<T>(D <T> obj);
};
没有它,编译器将寻找函数print()
,而不是函数模板print()
。