14.1 [temp.param], paragraph 2
...
typename
followed by an unqualified-id names a template type parameter.typename
followed by a qualified-id denotes the type in a non-type parameter-declaration...
我对粗体文本的含义有点困惑。具体来说,typename
可以出现在两个不同的上下文中(类型说明符 或模板参数),但是 this 指的是哪一个呢?
对于前一种情况,我考虑了:
struct A { struct X { }; int X; }; struct B { struct X { }; }; template<class T> void f(T t) { typename T::X x; // T can be A or B }
但是,
A::X
和B::X
都不是非类型参数声明(它们是成员声明)。对于后一种情况,我不确定为什么有必要。为什么不直接用qualified-id写下它的类型呢?是否需要参数化?
最佳答案
这是关于
struct S { typedef int X; };
template <typename T, typename T::X> void f() { }
int main() { f<S, 1>(); }
此处,typename T
表示 T
是命名模板类型参数,但 typename T::X
是未命名非命名类型-输入模板参数。
type-parameter 是用于模板类型参数的语法,parameter-declaration 是用于模板非类型参数的语法。
typename T
无法解析为参数声明中的类型名称说明符,因为它缺少嵌套名称-specifier,所以它必须是一个类型参数。
typename T::X
无法解析为类型参数,因为它只允许在 typename
关键字后使用单个标识符,所以它必须是一个参数声明。
我认为没有歧义,但文本阐明了这两个模板参数的解析方式有何不同。
关于c++ - "typename qualified-id"引用非类型参数声明中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440109/