代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

从子类访问受保护的成员:gcc与msvc

  •  5
  • Jason Baker  · 技术社区  · 16 年前

    在VisualC++中,我可以这样做:

    template <class T>
    class A{
    protected:
        T i;
    };
    
    template <class T>
    class B : public A<T>{
        T geti() {return i;}
    };
    

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

    template <class T>
    class B : public A<T>{
        T geti() {return A<T>::i;}
    };
    

    难道我不应该在标准C++中做前者吗?还是GCC配置错误导致我出错?

    3 回复  |  直到 8 年前
        1
  •  6
  •   Brian R. Bondy    16 年前

    这以前是允许的,但在 gcc 3.4 .

    在模板定义中,不合格名称将不再找到依赖基的成员(如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
          }
        };
    

    您必须使这些名称具有相关性,例如,通过在它们前面加上此->。这是C::H的正确定义,

        template <typename T> void C<T>::h ()
        {
          this->m = 0;
          this->f ();
          this->n = 0
          this->g ();
        }
    
        3
  •  0
  •   Nemanja Trifunovic    16 年前

    你可能想看看 two-phase name lookup