为什么我必须通过this指针访问模板基类成员?

时间:2011-01-10 01:42:38

标签: c++ templates inheritance c++-faq

如果下面的课程不是模板,我可以在x课程中使用derived。但是,使用下面的代码,我必须使用this->x。为什么呢?

template <typename T>
class base {

protected:
    int x;
};

template <typename T>
class derived : public base<T> {

public:
    int f() { return this->x; }
};

int main() {
    derived<int> d;
    d.f();
    return 0;
}

3 个答案:

答案 0 :(得分:243)

答案 1 :(得分:12)

(2011年1月10日的原始答案)

我想我找到了答案:GCC issue: using a member of a base class that depends on a template argument。 答案并非针对gcc。


更新:回应mmichael's comment,来自C ++ 11标准的draft N3337

  

14.6.2从属名称[temp.dep]
  [...]
  3在类或类模板的定义中,如果基类依赖于a   template-parameter,在非限定名称期间不检查基类作用域   在类模板的定义点查找   或成员或在类模板或成员的实例化期间。

是否“因为标准如此”算作答案,我不知道。我们现在可以问为什么标准要求,但正如Steve Jessop's excellent answer和其他人指出的那样,后一个问题的答案是相当长且可论证的。不幸的是,当涉及到C ++标准时,通常几乎不可能给出标准强制要求的简短而自成一体的解释;这也适用于后一个问题。

答案 2 :(得分:11)

继承期间隐藏x。你可以通过以下方式取消隐藏:

template <typename T>
class derived : public base<T> {

public:
    using base<T>::x;             // added "using" statement
    int f() { return x; }
};