当前的 C++ 编译器(最新的 gcc、clang)需要typename
以下示例中的关键字:
template<class T>
struct A
{
};
template<class T>
void f(T)
{
struct C
{
};
typedef typename A<C>::Type Type; // typename required
}
如果typename
省略 gcc (4.9, 5.0) 会报错:
need 'typename' before 'A<f(T)::C>::Type' because 'A<f(T)::C>' is a dependent scope
根据我对 C++11 标准的阅读,此示例的格式正确。
以下措辞似乎涵盖了此行为:
[温度.dep.type]/8
一个类型是依赖的,如果它是
模板参数,
未知专业的成员,
作为当前实例化成员的嵌套类或枚举,
一个 cv 限定类型,其中 cv 非限定类型是依赖的,
从任何依赖类型构造的复合类型,
由任何依赖类型构造的数组类型,或者其大小由依赖于值的常量表达式指定,
一个 simple-template-id,其中模板名称是模板参数或任何模板参数是依赖类型或依赖于类型或值的表达式,或
由 decltype(expression) 表示,其中 expression 取决于类型。
但是,根据 [class.local],该类C
是本地类而不是嵌套类。如果是这样,为什么要A<C>
被视为依赖?
编辑
对于奖励积分,如果通过添加成员枚举来修改示例C
,如下所示:
template<typename T>
struct A
{
typedef T Type;
};
template<class T>
void f(T)
{
struct C
{
enum { value = T::value };
};
typedef typename A<C>::Type Type; // typename required
}
现在应该A<C>
被视为依赖?