考虑以下代码:
struct S {
struct type {};
type type;
};
int main() {
typename S::type t;
(void) t;
}
除了不是一个好主意的事实外,我在这里阅读了关于SO的另一个问题后还在进行实验。
我发现,片段上方的编制与海湾合作委员会没有任何错误,它是由铛3.9拒绝与以下错误:
错误:类型名称说明符引用“ S”中的非类型成员“类型”
我怀疑铛就在这种情况下,和GCC是错误的(实际上,我打开一个问题是后者)。
是正确的结论还是对的有效使用typename
?
注意:我不是在问如何解决它,我知道该怎么做。我问仅当此代码是否有效。
即使存在,也可以使用通常的限定名称查找来找到限定ID
typename
。
也就是说,与elaborated-type-specifier的情况不同,在这种情况下,名称查找不会忽略非类型名称。
如果合格-ID的类型名称说明符并不表示一个类型或类模板,是形成不良的程序。
因此,在讨论的方案是形成不良。
[temp.res] / 4也有一个示例:
struct A {
struct X { };
int X;
};
struct B {
struct X { };
};
template<class T> void f(T t) {
typename T::X x;
}
void foo() {
A a;
B b;
f(b); // OK: T::X refers to B::X
f(a); // error: T::X refers to the data member A::X not the struct A::X
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句