下面的代码编译使用GCC 4.4.6和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;
}
它提供了在VC ++ 10以下错误:
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>;
};
你最初的例子不工作的原因类A
是私人B
和类C<B>
是朋友B
,但是当你访问成员name
从对象C<B>
系using T::name;
造成问题,因为类B
不具有任何成员name
在里面。 这其中找到成员范围搜索name
,当您试图通过类对象来访问它B
编辑:
使用A ::名到B需要照顾的问题,而是出版了A ::名成员给大家,而只应可见于特定的模板实例,即d。添加
如果是这样的话,那么只需声明语句using A::name;
在类中的私有部分B
即
struct B : private A {
protected: using A::name;
public:
friend struct C<B>;
};
似乎有在gcc和VC ++用构件使用-声明时之间的可视性方面的考虑有根本的区别; 检查无模板该简化的例子:
struct A { int name; };
struct B: private A { friend struct C; };
struct C: B {using B::name; };
int main()
{
C o;
o.name = 0;
}
这将汇编GCC但不能在VC ++(与基本相同的错误的问题)。 请问要咨询谁在做的是正确的标准...