在模板定义中要求类型名的原因
Reason for requiring typename in a template definition
可能的重复项:
我必须在何处以及为什么必须在依赖名称上放置"模板"和"类型名称"?
这是问题的一个具体例子:正式地,typename是干什么用的?
我问的是编译器不知道以下类型的具体原因:
#include <set>
#include <vector>
template<typename T> // T is a type, right?
void f(const char name[], const std::vector<T>& foo) // typename NOT needed here
{
for(std::set<T>::iterator itr = // here, it is needed
如果我声明:
std::set<int>::iterator itr; // no problem
上面清楚地定义了T
是一种类型,那么为什么typename
在一种类型中是必需的,而不是另一种呢?
虽然你已经链接到一个完整的答案,但有很多东西需要涉足。 所以 - 尽可能简单地说 - 关键是编译器确实知道T
是你所说的一种类型,但是使用该信息,甚至已经看到了包含的源代码std::set
,它无法确定set<T>
内的iterator
标识符是否会命名一个类型, 函数或变量。 这可能看起来令人惊讶,因为如果您查看set<>
模板,您可以解决它,但请记住,在编译器解析f<>()
模板和实例化之前之间的某个地方,可能会指定一个专门用于set<T>
的专用化,该专用化使用非类型的标识符,或者干脆完全缺少它。
因此,typename
关键字只是告诉编译器,嘿 - 无论发生什么,您都可以期望iterator
命名一个类型,并在此基础上对f<>()
模板代码执行一些验证,而无需等待看到实例化。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?