"typename"不应该只在模板函数或模板类中使用吗?

Shouldn't `typename` only be used in template function or template class?

本文关键字:函数 typename 不应该      更新时间:2023-10-16

typename不应该只用于模板函数或模板类吗?为什么下面的解释是合法的?typename在下面的解释中有什么功能?

#define DECLARE(T)  using Request = typename T::Request;

如果能就此问题提供任何提示,我将不胜感激。

这是为了允许在宏中使用这样的表达式(如原始帖子中所述(。

宏无法知道它是否与模板类型参数一起使用,但必须在两者中工作。由于使用模板时需要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>();

你的行是一个宏,它是预处理器的指令,用using Request = typename T::Request;替换DECLARE(T)的所有出现,同时用提供的实际类型替换类型T。例如,如果编译器看到任何DECLARE(string),它将用using Request = typename string::Request;替换它。