clang 3.0 和 g++ 4.8.1 都拒绝以下代码,并在注释中显示错误:
template<typename T>
struct S
{
void f()
{
this->dependent(); // no error: type of 'this' is dependent?
this->Dependent::dependent(); // error: 'Dependent' has not been declared
}
};
根据 [basic.lookup.classref]
. 后面的类名或命名空间名。or -> 操作符在整个后缀表达式的上下文和对象表达式的类范围内查找。
和 [temp.dep.expr]
this
如果封闭成员函数的类类型是依赖的,则依赖于类型。
如果在Dependent
对象表达式的类的范围内查找类或命名空间名称* this
,并且对象表达式的类是依赖的,那么这种查找是否应该推迟到模板实例化之前?标准是否指定了正确的行为?
编辑:clang 3.0 接受以下代码,但 g++4.8 给出与上述相同的错误
template<typename T>
struct S
{
T m;
void f()
{
m.dependent();
m.Dependent::dependent();
}
};