Так как вы хотите получить доступ к закрытым членам класса шаблона, созданным с различными типами, вы должны сделать другие шаблоны другом класса шаблона как:
template <class T>
class Container
{
template<class U>
friend class Container;
};
Обратите внимание, что если T
и U
- это разные типы, то Container<T>
и Container<U>
- это два совершенно разных класса; никто не может получить доступ к закрытым членам других, если вы не делаете друга одним из других.
Также обратите внимание, что в приведенном выше коде все экземпляры шаблона класса являются друзьями друг друга . То есть, если вы создадите его с помощью char
, int
, short
, тогда
Container<int>
будет другом как Container<char>
, так и Container<short>
.
Container<char>
будет другом как Container<int>
, так и Container<short>
.
Container<short>
будет другом как Container<int>
, так и Container<char>
.
Интересная фраза здесь: «друг друга» . Обычно этого не происходит. Например, если у вас есть такой класс:
class A
{
friend class B;
};
Тогда вот только B
друг A
. A
НЕ является другом B
. Они НЕ "друг друга" . B
может получить доступ к закрытым членам A
, но A
не может получить доступ к закрытым членам B
. В этом разница между этим классом и классом шаблона выше.