在什么情况下,"name"必须以"typename"为前缀?
In what cases a "name" has to be prefixed with "typename"?
可能重复:
我必须把";模板";以及";typename";依赖名称?
我只知道使用它们的两种情况(我认为这是模板参数依赖性,但我只知道这两种形式(:
- 在参数列表中,即
<typename T>
- 如
typename X::Sub_type Xx
那么,还有更多的案例,或者这一切背后有一些理论?
您需要typename
关键字来引用名称依赖于模板参数的类型。依赖性的确切规则并非微不足道,但基本上,任何类型或模板参数内部的任何类型,或任何模板的实例化(其中一个参数指向您自己的模板(都是依赖的。
template <typename T, int I>
struct test {
typename T::x x; // internal to your argument
typename other_template<T>::y y; // to the instantiation of your template with an argument
typename another_tmpl<I>::z z; // even if the template argument is not a type
};
1>这不是真正的原因,因为您可以简单地编写<class T>
作为替换。
<typename T>
2> 这就是typename背后的真正原因,在限定的依赖类型之前需要它。
template <class T>
void foo() {
typename T::iterator * iter;
...
}
这里没有typename,有一个C++解析规则说,即使会导致语法错误,合格的依赖名称也应该被解析为非类型。
相关文章:
- 为什么返回类型中需要typename?C++
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 查找带有 Anaconda cmake 前缀的 boost-python3
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 迭代器类的重载前缀增量运算符会引发分段错误
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 生成前缀位掩码
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何在自定义对象的<<运算符中添加自定义前缀
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 以C++显示单词的所有前缀
- 在这种情况下,"typename..."意味着什么?
- QXmlStreamWriter,命名空间和前缀
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 为什么所有type_traits类都必须使用 'typename' 和'::type'前缀/后缀调用?
- 在什么情况下,"name"必须以"typename"为前缀?