猿问

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

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

如果下面的类不是模板,我可以xderived课堂上使用。但是,使用下面的代码,我必须使用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;}


烙印99
浏览 738回答 3
3回答

慕斯王

我想我找到了答案:GCC问题:使用依赖于模板参数的基类成员。答案并非针对gcc。更新:回应mmichael的评论,来自C ++ 11标准的N3337草案:14.6.2从属名称[temp.dep][...]&nbsp;3在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间不会检查基类范围类模板或成员的定义点,或者在类模板或成员的实例化过程中。无论是“因为标准是这样说的”算作一个答案,我不知道。我们现在可以问为什么标准要求,但正如Steve Jessop的优秀答案和其他人所指出的那样,后一个问题的答案相当长且可论证。不幸的是,当涉及到C ++标准时,通常几乎不可能给出标准强制要求的简短而自成一体的解释;&nbsp;这也适用于后一个问题。

慕虎7371278

在x继承过程中被隐藏。你可以通过以下方式取消隐藏:template&nbsp;<typename&nbsp;T>class&nbsp;derived&nbsp;:&nbsp;public&nbsp;base<T>&nbsp;{public: &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;base<T>::x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;added&nbsp;"using"&nbsp;statement &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;f()&nbsp;{&nbsp;return&nbsp;x;&nbsp;}};
随时随地看视频慕课网APP
我要回答