是否有可能以某种方式使部分模板规范成为朋友类?即考虑你有以下模板类
template <class T> class X{
T t;
};
现在你有了部分特化,例如指针
template <class T> class X<T*>{
T* t;
};
我想要完成的是,每一个可能X<T*>
都是X<S>
for ANY的朋友类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*>
”声明为“朋友”
这根本不可能,还是有一些解决方法?
我问的原因是我需要一个构造函数来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
在构造函数中是不可见的,因为它是私有的。这就是为什么我需要一个部分专业化的朋友班。