c++ - 在模板定义中要求类型名的原因

标签 c++ typename

Possible Duplicate:
Where and why do I have to put “template” and “typename” on dependent names?

这是问题的一个具体实例:Officially, what is typename for?

我询问编译器不知道以下是类型的具体原因:

#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 包含的源代码,无法确定 iterator 是否set<T> 内的标识符将命名类型、函数或变量。如果您查看set<>,这可能看起来令人惊讶。模板你可以解决它,但请记住编译器解析你的 f<>() 之间的某个地方模板并在实例化之前,专门化 set<T>可以指定使用非类型的标识符,或者干脆完全没有它。

所以,typename关键字只是告诉编译器,嘿 - 无论发生什么,你都可以预料到 iterator命名类型,并对 f<>() 执行一些验证在此基础上编写模板代码,而无需等待查看实例化。

关于c++ - 在模板定义中要求类型名的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6062270/

相关文章:

c++ - 开发 H264 硬件解码器 Android - Stagefright 或 OpenMax IL?

c++ - 是否可以使用 Qt 类枚举网络根?

使用 STL 容器和 typedef 的 C++ 模板类

c++ - 模板类中的 Typedef 不起作用

c++ - 多个嵌套的相关名称 - 在哪里粘贴 typename 关键字?

c++ - 这个程序的名称是什么?

c++ - 如何从 OpenCL 访问 OpenCV UMat (gpu) 缓冲区?

c++ - 如果 MFC RUNTIME_CLASS 参数具有命名空间,则编译器错误

c++ - 在模板中返回一个迭代器

C++ 条件表达式中的 sizeof( typename T)