C++ 允许“this->;”的规则是什么要访问依赖基类的成员?
正如我们所知,下面的代码格式不正确,因为成员C++ 允许“this->;”的规则是什么要访问依赖基类的成员?,c++,templates,language-lawyer,name-lookup,dependent-name,C++,Templates,Language Lawyer,Name Lookup,Dependent Name,正如我们所知,下面的代码格式不正确,因为成员x位于依赖基类中。但是,将指示行上的x更改为this->x,将修复错误 template <typename T> struct B { int x; }; template <typename T> struct C : B<T> { void f() { int y = x; // Error! } }; int main() { C<int> c;
x
位于依赖基类中。但是,将指示行上的x
更改为this->x
,将修复错误
template <typename T>
struct B {
int x;
};
template <typename T>
struct C : B<T> {
void f() {
int y = x; // Error!
}
};
int main() {
C<int> c;
c.f();
}
模板
结构B{
int x;
};
模板
结构C:B{
void f(){
int y=x;//错误!
}
};
int main(){
C C;
c、 f();
}
我想解释一下标准中是如何规定这种行为的。根据[临时部门]/3:
在类或类模板的定义中,如果基类依赖于模板参数,则基类
在非限定名称查找期间,在类模板的定义点也不检查作用域
或成员,或在类模板或成员的实例化过程中
这似乎解释了为什么单独使用x
会失败。在定义点查找名称x
,不检查基类范围。但是,如果我们使用this->x
?现在名称x
是依赖的,其查找将推迟到实例化。但是引用的段落似乎暗示,即使在实例化时也不应该找到x
,因为this->x
中的x
查找仍然是不合格的查找
显然,实现不会以这种方式运行,而且人们普遍认为,一旦模板被实例化,就会搜索基类范围
类成员访问表达式(5.2.5.[expr.ref])不使用非限定的查找规则,它们使用类成员访问查找规则(3.4.5[basic.lookup.classref]) (2) 如果类成员访问(5.2.5)中的id表达式是非限定id,则对象表达式的类型 属于类类型
C
,将在类C
的范围内查找不合格id
这不是非限定查找(3.4.1[basic.lookup.unqual]),这是类成员访问表达式查找(3.4.5[basic.lookup.classref])。@n.m.谢谢,我没有意识到类成员名称查找是一种不同类型的名称查找。你应该回答这个问题,“依赖基类”到底是什么?而不是说一个独立的基类?有这样的事情吗?@EJP在
模板结构C:B{…}
中,B
不是一个依赖的基类。这并没有真正说明为什么答案与非限定名称不同(它显然考虑了任何包含类的范围)。