Не могу понять функции друзей в классе шаблона

Это код, который я написал, чтобы понять концепцию. Код в порядке, и он работает.

Что я не понимаю, так это то, зачем нужна отмеченная линия?

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);
};

3

Решение

Согласно [temp.friend], вы должны предоставить явные аргументы шаблона, чтобы сделать специализацию функции шаблона другом:

template <class T>
class D
{
public :
friend void print<T>(D <T> obj);
};

Без этого компилятор будет искать функцию print(), а не шаблон функции print(),

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]