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]
the class-name-or-namespace-name following the . or -> operator is looked up both in the context of the entire postfix-expression and in the scope of the class of the object expression.
并且[temp.dep.expr]
this
is type-dependent if the class type of the enclosing member function is dependent.
如果在对象表达式*的类的范围内查找类或命名空间名称Dependent,并且对象表达式的类是依赖的,那么在实例化模板之前是否应该延迟此查找?标准是否指定了正确的行为?
编辑:clang 3.0接受以下代码,但g 4.8给出与上面相同的错误
template<typename T>
struct S
{
T m;
void f()
{
m.dependent();
m.Dependent::dependent();
}
};
最佳答案 在您的第一个代码中,两行都是“格式错误,无需诊断”,因为“this”指的是当前实例化,但未找到任何成员且类模板没有依赖基类.
它既不是当前实例化的成员,也不是未知专业化的成员.见14.6.2.1p6