2012-03-20 2 views
0

Можно ли сделать ФРИЕНД класс шаблон, например:Templatize дружба в C++

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

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

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

+2

Существует способ: использовать [CRTP] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) –

+0

Если T и MyClass могут иметь общий базовый класс, я думаю, что CRTP - прекрасное решение! –

+3

это [разрешено сейчас] (http://stackoverflow.com/questions/6510041/template-parameter-as-a-friend) – Lol4t0

ответ

4

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

§7.1.5.3/2

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

 friend class T; 

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

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

§7.1.5.3/2

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

friend class T; 

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

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

+0

Странно, но практично в моем случае :) Спасибо, Дэвид. – Shnippoo

Смежные вопросы