有没有可能将部分模板规范设置为友元类?例如,考虑您拥有以下模板类
template <class T> class X{
T t;
};
现在您可以进行部分特化,例如指针。
template <class T> class X<T*>{
T* t;
};
我希望实现的是,每个可能的
X<T*>
都是 X<S>
的友元类,对于任何 S
。也就是说,X<A*>
应该是 X<B>
的友元。当然,我考虑过在 X 中使用普通的模板友元声明:
template <class T> class X{
template <class S> friend class X<S*>;
}
然而,这段代码无法编译,g++ 告诉我如下:
test4.cpp:34:15: 错误: 'template<class T> class X
' 的特化必须出现在命名空间作用域
test4.cpp:34:21: 错误: 部分特化 'X<S*>
' 声明为 'friend'
这个问题到底是根本不可能实现呢?还是有一些变通方法?
我之所以问,在于我需要在 X<T*>
中提供一个构造函数,该函数可以从任意的 X<S>
创建这个类(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
在构造函数中不可见,因为它是私有的。这就是为什么我需要一个部分特化友元类。
get
函数真的不可能吗?这对我来说更加简洁,避免了所有模板友元的疯狂。 - pmr