从子类访问受保护的成员:gcc与msvc 在VisualC++中,我可以做这样的事情: template <class T> class A{ protected: T i; }; template <class T> class B : public A<T>{ T geti() {return i;} }; 模板 甲级{ 受保护的: TⅠ; }; 模板 B类:公共A{ T geti(){return i;} };

从子类访问受保护的成员:gcc与msvc 在VisualC++中,我可以做这样的事情: template <class T> class A{ protected: T i; }; template <class T> class B : public A<T>{ T geti() {return i;} }; 模板 甲级{ 受保护的: TⅠ; }; 模板 B类:公共A{ T geti(){return i;} };,c++,gcc,g++,visual-c++,C++,Gcc,G++,Visual C++,如果我试图用g++编译这个,我会得到一个错误。我必须这样做: template <class T> class B : public A<T>{ T geti() {return A<T>::i;} }; 模板 B类:公共A{ T geti(){返回A::i;} }; 在标准C++中我不应该做前者吗?或者是gcc配置错误导致了错误?这过去是允许的,但在中有所改变 在模板定义中,不合格名称将不再找到依赖基的成员(如C++标准中的[ TEMP .DEP

如果我试图用g++编译这个,我会得到一个错误。我必须这样做:

template <class T>
class B : public A<T>{
    T geti() {return A<T>::i;}
};
模板
B类:公共A{
T geti(){返回A::i;}
};

在标准C++中我不应该做前者吗?或者是gcc配置错误导致了错误?

这过去是允许的,但在中有所改变

在模板定义中,不合格名称将不再找到依赖基的成员(如C++标准中的[ TEMP .DEP]/3所指定的)。比如说,

    template <typename T> struct B {
      int m;
      int n;
      int f ();
      int g ();
    };
    int n;
    int g ();
    template <typename T> struct C : B<T> {
      void h ()
      {
        m = 0; // error
        f ();  // error
        n = 0; // ::n is modified
        g ();  // ::g is called
      }
    };
模板结构B{
int m;
int n;
intf();
int g();
};
int n;
int g();
模板结构C:B{
空位h()
{
m=0;//错误
f();//错误
n=0;/::n已修改
g();/::g被调用
}
};
您必须使名称相互依赖,例如,在名称前加上此->。下面是C::h的正确定义

    template <typename T> void C<T>::h ()
    {
      this->m = 0;
      this->f ();
      this->n = 0
      this->g ();
    }
模板无效C::h()
{
这个->m=0;
这个->f();
此->n=0
这个->g();
}

我想出了这个办法:


显然,第一个例子不是有效的C++,MSVC采用它是不好的。在C++ FAQ Lite上有解决方案。

< P>你可能想读一下GCC的版本[P/P>:HEH…你一定是在我发邮件的同时发的。奇怪的是,msvc接受了这一点,尽管它是无效的(并且导致了奇怪的运行时错误)。我认为gcc和vc++的旧版本可能都支持错误的方式。但gcc选择了正确的方式,vc++选择了保持向后兼容性。