Templatize дружба в C ++ - PullRequest
       16

Templatize дружба в C ++

0 голосов
/ 20 марта 2012

Можно ли сделать из класса друга шаблон, например:

template <class T>
class MyClass {
public:
    friend class T;
};

Причина, по которой я стремлюсь получить это, заключается в том, что я использую основанный на политике дизайн и хочу, чтобы мои классы политики получили доступ к членам хоста. (... теперь я начинаю думать, что это может означать, что мой дизайн просто плохой ...)

Заранее спасибо, ребята!

1 Ответ

4 голосов
/ 20 марта 2012

В C ++ 03 вам не разрешается объявлять дружбу с аргументом шаблона.

§7.1.5.3 / 2

[...] Если идентификатор преобразуется в typedef-имя или шаблонный тип-параметр, то разработанный тип-спецификатор неверен. [Примечание: это подразумевает, что в шаблоне класса с параметром типа шаблона T объявление

       friend class T;

плохо сформирован. ]

В C ++ 11 произошли некоторые изменения в этом отношении, но это немного странно. friend class T; по-прежнему плохо информирован, но friend T разрешено. Цитата может быть найдена в том же пункте:

§7.1.5.3 / 2

[...] [Примечание: это означает, что в шаблоне класса с параметром типа шаблона T объявление

 friend class T;

плохо сформирован. Тем не менее, аналогичные декларации друг T; разрешено (11.3). - конец примечания]

Примечания не являются нормативными, но они указывают на смысл норм, которые его окружают. Мне не удалось найти конкретное предложение, которое делает примечание правильным, но я предполагаю, что по крайней мере, намерение состоит в том, что это должно быть разрешено.

...