如果下面的类不是模板,我可以在派生类中简单地使用 x。但是,对于下面的代码,我必须使用 this->x。为什么?模板
如果下面的类不是模板,我可以直接 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;
}
(原始答案来自 2011 年 1 月 10 日)
我想我已经找到了答案: GCC 问题:使用依赖于模板参数的基类成员 。答案并不是特定于 gcc 的。
更新: 响应 mmichael 的评论 ,来自 C++11 标准 草案 N3337
14.6.2 依赖名称 [temp.dep]
[...]
3 在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或者类模板或成员的实例化期间,在非限定名称查找期间不会检查基类范围。
我不知道 “因为标准是这么说的” 是否 Steve Jessop 的出色回答 和其他人指出的那样,后一个问题的答案相当冗长且有争议。不幸的是,当涉及到 C++ 标准时,通常几乎不可能给出一个简短而完整的解释来说明为什么标准会要求这样做;这也适用于后一个问题。