是否有可能以某种方式使部分模板规范成为友元类? IE。假设您有以下模板类
template <class T> class X{
T t;
};
现在你有了部分特化,例如,对于指针
template <class T> class X<T*>{
T* t;
};
我想要完成的是一切可能X<T*>
是一个友元类X<S>
对于任何人S
. I.e. 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
在构造函数中不可见,因为它是私有的。这就是为什么我需要一个部分专业化的朋友班。
在 C++ 中,您可以授予超出以下范围的访问权限private
在四个层面上。
- 完全地
public
访问(参见 pmr 的回答)
- 继承层次结构中的访问(
protected
,此处无关)
- 到基本模板
friend
(见这个答案)
- 到非模板或完全专业化
friend
(太弱了,无法解决您的用例)
后两种友谊之间没有中间道路。
来自 C++ 标准第 14.5.4 节:
友元声明不得声明部分特化。
以下声明将允许您实现您所需要的。它使您可以自由地从任何其他专业化访问模板的任何专业化,但仍然仅限于X
。它比您所要求的稍微宽松一些。
template<class T> class X
{
template<class Any> friend class X;
public:
...
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)