Можно ли как-то сделать спецификацию частичного шаблона дружественным классом? т.е. допустим, у вас есть следующий шаблонный класс
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
'должен появиться в пространстве имен
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
не виден в конструкторе, поскольку он закрытый. Вот почему мне нужен класс друзей с частичной специализацией.