首页 > 解决方案 > `typename` 不应该只用在模板函数或模板类中吗?

问题描述

不应该typename只用在模板函数或模板类中吗?为什么下面的表达式是合法的?下面的表达式中 typename 的作用是什么?

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

对于这个问题的任何提示,我将不胜感激。

标签: c++typename

解决方案


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

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

推荐阅读