`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>();