c++ - `typename` 不应该只用在模板函数或模板类中吗?
问题描述
不应该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>();
推荐阅读
- excel - 从VBA中的文本文件中提取信息
- android - android中android.arch.lifecycle的iOS equivalnet?
- java - javax.mail.MessagingException:无法连接到 SMTP 主机:smtp.gmail.com,端口:587 无法解决此问题
- windows - 在 git bash 中使用 python json.tool 时出现“stdin is not a tty”错误
- c - 错误:使用类型“sfVector2f”初始化类型“unsigned int”时类型不兼容
- java - 如何查看向下转换在 Java 中是否合法?
- html - html 元标记未在框架集的父级中继承
- jxbrowser - JxBrowser:如何在 ContextMenuHandler 中实现“链接另存为”
- python - Mac 上的 Visual Studio Code 上的缩进错误(再次)
- python-dateutil - 规则日期偏移一周