"typename"不应该只在模板函数或模板类中使用吗?
Shouldn't `typename` only be used in template function or template class?
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;
替换它。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- "typename"不应该只在模板函数或模板类中使用吗?
- 如何将一个使用参数包和typename的类作为函数(c++)的输入参数
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 比较函数模板中的 VARTYPE 和 typeid().name / typename
- C 好奇的情况将TypeName/DataType名称/类名称传递给线程构造函数
- 标准::函数的 typename 关键字
- 模板成员转换运算符,默认模板参数到与 TypeName 绑定的函数
- 需要帮助来理解具有复杂typename参数的模板函数
- 为什么在函数参数列表中重复typename关键字是必要的
- C++在继承构造函数中使用具有typename的声明
- 在模板化类的typedef之后使用typename初始化函数时出错
- C++:模板成员函数,如 template<typename T> int foo<T>()
- 带有模板参数或typename的模板函数
- 编译时的Typename到函数名的映射
- 函数模板:typename声明
- 将模板typename类作为函数参数传递