Шаблоны C++: частичные спецификации шаблонов и дружественные классы

Можно ли как-то сделать спецификацию частичного шаблона дружественным классом? т.е. допустим, у вас есть следующий шаблонный класс

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

Теперь у вас есть частичная специализация, например, для указателей

template <class T> class X<T*>{
    T* t;
};

Я хочу добиться того, чтобы каждый возможный Xбыл дружественным классом для Xдля ЛЮБОГО S. т.е. Xдолжен быть другом X.

Конечно, я думал об обычном объявлении друга шаблона в X:

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

Однако это не компилируется, g++ говорит мне следующее:

test4.cpp:34:15: ошибка: специализация ' template class X'должен появиться в пространстве имен

test4.cpp:34:21: ошибка: частичная специализация 'X'объявлен 'друг'

Это вообще невозможно или есть обходной путь?

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

Код выглядит следующим образом:

template <class T> class X<T*>{
    T* t;

    template<class S>
    X(X<S> x) : t(&(x.t))  {} //Error, x.t is private
}

Теперь компилятор, конечно, жалуется, что x.tне виден в конструкторе, поскольку он закрытый. Вот почему мне нужен класс друзей с частичной специализацией.

8
задан gexicide 15 June 2012 в 07:54
поделиться