Можно ли пометить шаблон псевдонима как друга?
Представьте, что у нас есть этот код:
template <class, class>
class Element
{};
template <class T>
class Util
{
public:
template <class U>
using BeFriend = Element<T, U>;
};
Можно ли отметить BeFriend
как друг? (Из Util
или любой другой класс).
редактировать
"Очевидный" синтаксис был опробован, но оба не удалось с Clang 3.6.
template <class> friend class BeFriend;
template <class> friend BeFriend;
Я не знал о втором синтаксисе, но нашел его в этом ответе. Кажется, что это работает (и необходимо) для псевдонимов, не являющихся шаблонами, но не помогает в этом случае, когда псевдоним является шаблонным.
(Примечание: как некоторые могут сделать вывод из минимального примера, я ищу способ обойти ограничение, заключающееся в том, что C++ не позволяет использовать частичную специализацию шаблонов)
2 ответа
Я думаю, что вы не можете сделать это, потому что частичные специализации не могут быть объявлены как друзья.
С обычной стороны, [temp.friend] / 7
Объявления друзей не должны объявлять частичные специализации. [ Пример:
template<class T> class A { }; class X { template<class T> friend class A<T*>; // error };
- конец примера]
Вы должны указать более общую версию, такую как:
template <class, class> friend class Element;
или полная указанная версия, такая как:
using BeFriend = Element<T, int>;
friend BeFriend;
Проблема не в псевдониме, а в том, что"частичная специализация не может быть объявлена другом".
template <class, class> friend class Element; // OK
template <class, class> friend class Element<T, T>; // Error