为什么我必须通过this指针访问模板基类成员?如果下面的类不是模板,我可以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 回答
慕斯王
TA贡献1864条经验 获得超2个赞
我想我找到了答案:GCC问题:使用依赖于模板参数的基类成员。答案并非针对gcc。
更新:回应mmichael的评论,来自C ++ 11标准的N3337草案:
14.6.2从属名称[temp.dep]
[...]
3在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间不会检查基类范围类模板或成员的定义点,或者在类模板或成员的实例化过程中。
无论是“因为标准是这样说的”算作一个答案,我不知道。我们现在可以问为什么标准要求,但正如Steve Jessop的优秀答案和其他人所指出的那样,后一个问题的答案相当长且可论证。不幸的是,当涉及到C ++标准时,通常几乎不可能给出标准强制要求的简短而自成一体的解释; 这也适用于后一个问题。
慕虎7371278
TA贡献1802条经验 获得超4个赞
在x
继承过程中被隐藏。你可以通过以下方式取消隐藏:
template <typename T>class derived : public base<T> {public: using base<T>::x; // added "using" statement int f() { return x; }};
- 3 回答
- 0 关注
- 737 浏览
添加回答
举报
0/150
提交
取消