【问题标题】:Accessing protected members from subclasses: gcc vs msvc从子类访问受保护的成员:gcc vs msvc
【发布时间】:2010-09-16 16:58:37
【问题描述】:

在 Visual C++ 中,我可以这样做:

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 配置错误导致我出错?

【问题讨论】:

标签: c++ gcc g++ visual-c++


【解决方案1】:

这曾经是允许的,但在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
      }
    };

您必须使名称依赖,例如通过在它们前面加上 this->。这是 C::h 的正确定义,

    template <typename T> void C<T>::h ()
    {
      this->m = 0;
      this->f ();
      this->n = 0
      this->g ();
    }

【讨论】:

  • 嘿...你一定是和我同时发的。奇怪的是 msvc 接受它,即使它是无效的(并且导致奇怪的运行时错误)。
  • 是的,我在找到发行说明后就看到了您的帖子。我认为 gcc 和 vc++ 的旧版本可能都支持错误的方式。但是 gcc 选择让它正确,而 vc++ 选择保持向后兼容性。
【解决方案2】:
【解决方案3】:

您可能想了解two-phase name lookup

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2014-06-07
    • 1970-01-01
    • 2017-08-01
    • 2016-10-01
    • 2018-09-15
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多