Nic*_*ick 7 c++ templates visual-c++ private-inheritance
以下代码使用GCC 4.4.6和Comeau 4.3.10进行编译.
#include <iostream>
struct A { int name; };
template<typename T> struct C : T { using T::name; };
struct B : private A { friend struct C<B>; };
int main()
{
C<B> o;
o.name = 0;
}
Run Code Online (Sandbox Code Playgroud)
它在VC++ 10中给出以下错误:
Run Code Online (Sandbox Code Playgroud)main.cpp(4): error C2877: 'A::name' is not accessible from 'A' main.cpp(10): error C2247: 'A::name' not accessible because 'B' uses 'private' to inherit from 'A'
什么是允许的良好的交叉编译器解决方案o.name = 0;?
注意:添加using A::name以B处理问题,但将A::name成员发布给每个人,而它应该只对特定模板实例可见,即C<B>.
解决方法是@kerrekSB建议的,using A::name;在课堂上添加B:
struct A { int name; };
template<typename T> struct C : T { using T::name; };
struct B : private A {
using A::name;
friend struct C<B>;
};
Run Code Online (Sandbox Code Playgroud)
你的初始例子没有工作因为class A是私有的B而class C<B>是朋友B但是当你name从对象访问成员时C<B>,line using T::name;会因为类B中没有任何成员name而产生问题.它是范围搜索,name当您尝试通过类对象访问它时找到该成员B
编辑:
使用A :: name添加到B可以解决问题,但是将A :: name成员发布给每个人,而它应该仅对特定的模板实例可见,即C
如果是这种情况,那么只需using A::name;在类中的私有部分声明声明B即
struct B : private A {
protected: using A::name;
public:
friend struct C<B>;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |