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]
后面的class-name-or-namespace-name。或 - &gt;在整个后缀表达式的上下文和对象表达式的类的范围内查找运算符。
和[temp.dep.expr]
如果封闭成员函数的类类型是依赖的,则
this
依赖于类型。
如果在对象表达式* Dependent
的类的范围内查找了class-or-namespace-name this
,并且对象表达式的类是依赖的,那么这应该是在模板实例化之前,查找不会延迟?标准是否指定了正确的行为?
编辑:clang 3.0接受以下代码,但g ++ 4.8提供与上面相同的错误
template<typename T>
struct S
{
T m;
void f()
{
m.dependent();
m.Dependent::dependent();
}
};
答案 0 :(得分:2)
在您的第一个代码中,两个行都是“格式错误,无需诊断”,因为“this”指的是当前实例化,但未找到任何成员且类模板没有依赖基类。
它既不是当前实例化的成员,也不是未知专业化的成员。见14.6.2.1p6