在VC ++模板10私有继承是不可访问(template private inheritance i

2019-09-22 04:13发布

下面的代码编译使用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::nameB需要照顾的问题,而是出版A::name成员给大家,而这应该只是一个特定的模板实例可见,即C<B>

Answer 1:

解决办法是什么@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>;
};


Answer 2:

似乎有在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 ++(与基本相同的错误的问题)。 请问要咨询谁在做的是正确的标准...



文章来源: template private inheritance in vc++10 is not accessible