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/