Почему тип шаблона не может быть классом друга в C ++? - PullRequest
0 голосов
/ 08 сентября 2018
template<typename T>
class A
{
    friend class T;
    int n;
};

struct B
{
    B()
    {
        A<B>{}.n; 
        // error : 'n' is a private member of 'A<B>'
    }
};

Почему тип шаблона не может быть классом друга в C ++?

1 Ответ

0 голосов
/ 08 сентября 2018

Используя ключевое слово class, вы можете объявить новый тип с именем T; который не ссылается на параметр шаблона T. (Фактически он скрывает параметр шаблона T.)

Просто удалите ключевое слово class, тогда объявление друга не будет пересылать объявление нового типа.

template<typename T>
class A
{
    friend T;
    int n;
};

Это использование (friend спецификатор простого типа ; friend спецификатор типа ;) появился с C ++ 11.

...