以下代码使用 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;
}
在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;
?
Note: Adding using A::name
to 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>
, line using T::name;
自上课以来就产生问题B
没有任何成员name
在里面。这是查找成员的范围搜索name
当您尝试通过类对象访问它时B
Edit :
添加 using A::name 到 B 可以解决问题,但会发布
A::name 成员对每个人都可见,而它应该只对某个人可见
特定的模板实例化,即 C
如果是这样的话,那么只需声明语句using A::name;
在课堂上的私人部分B
i.e
struct B : private A {
protected: using A::name;
public:
friend struct C<B>;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)