Параметр шаблона в друзья

В C++03 следующее недопустимо, хотя некоторые компиляторы поддерживают это.

template <class T>
class X
{
    friend T;
};

Это было узаконено в C++11? (Извините, я не успел прочитать черновик, просто надеясь, что кто-то это знает)

3 ответа

Решение

Из раздела §11.3, 3 в N3291:

template <typename T> class R {
  friend T;
};

R<C> rc; // class C is a friend of R<C>
R<int> Ri; // OK: "friend int;" is ignored

Так что это законно в C++11.

Да, C++0x позволяет параметру шаблона быть друзьями.

Я вспомнил, что читал его в черновике раньше, но не смог найти ссылку. Во всяком случае, ответ @Praetorian прибил его.

Это недопустимо в простом C++, но есть простой обходной путь

template <class T>
class X
{
    private:
        class Wrapper
        {
            public:
                typedef T Type;
        };
        friend class Wrapper::Type;
};
Другие вопросы по тегам