`typename` 不应该只用在模板函数或模板 class 中吗?
Shouldn't `typename` only be used in template function or template class?
不应该typename
只在模板函数或模板class中使用吗?为什么下面的表达式是合法的?下面表达式中typename的作用是什么?
#define DECLARE(T) using Request = typename T::Request;
对于这个问题的任何提示,我将不胜感激。
你的行是一个宏,它是预处理器的指令,用 using Request = typename T::Request;
替换所有出现的 DECLARE(T)
,同时用 T
替换类型提供实物。例如,如果编译器在任何地方看到 DECLARE(string)
,它会将其替换为 using Request = typename string::Request;
。
这是为了允许在宏中使用这样的表达式(如原文post中提到的)。
宏无法知道它是否与模板类型参数一起使用,但必须在两者中都起作用。由于在使用模板时需要 typename
,因此在非模板代码中允许它(可以忽略)是有意义的。
您的原始代码作为这种用法的示例(;
在最后删除):
#define DECLARE(T) using Request = typename T::Request
此宏在模板和非模板代码中均有效:
struct Container { using Request = int; };
struct A { DECLARE(Container); };
template<typename T>
struct B { DECLARE(T); };
如果没有 typename
,你会得到这样代码的编译错误:
B<Container>();
不应该typename
只在模板函数或模板class中使用吗?为什么下面的表达式是合法的?下面表达式中typename的作用是什么?
#define DECLARE(T) using Request = typename T::Request;
对于这个问题的任何提示,我将不胜感激。
你的行是一个宏,它是预处理器的指令,用 using Request = typename T::Request;
替换所有出现的 DECLARE(T)
,同时用 T
替换类型提供实物。例如,如果编译器在任何地方看到 DECLARE(string)
,它会将其替换为 using Request = typename string::Request;
。
这是为了允许在宏中使用这样的表达式(如原文post中提到的)。
宏无法知道它是否与模板类型参数一起使用,但必须在两者中都起作用。由于在使用模板时需要 typename
,因此在非模板代码中允许它(可以忽略)是有意义的。
您的原始代码作为这种用法的示例(;
在最后删除):
#define DECLARE(T) using Request = typename T::Request
此宏在模板和非模板代码中均有效:
struct Container { using Request = int; };
struct A { DECLARE(Container); };
template<typename T>
struct B { DECLARE(T); };
如果没有 typename
,你会得到这样代码的编译错误:
B<Container>();