2

可能重复:
我必须在何处以及为什么必须将“模板”和“类型名称”放在从属名称上?

这是问题的一个具体实例:正式地说,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需要一个而不是另一个呢?

4

1 回答 1

4

虽然您已经链接到一个彻底的答案,但要经历很多事情。所以 - 尽可能简单地说 - 关键是编译器确实知道这T是你所说的一种类型,但是使用该信息,甚至已经看到包含的源代码std::set,它不能iterator确定里面的标识符是否将set<T>命名一个类型、一个函数或一个变量。这可能看起来令人惊讶,因为如果您查看set<>模板就可以解决它,但请记住,在编译器解析f<>()模板和实例化之前之间的某个地方,set<T>可能会指定使用非类型标识符的专门化,或者只是缺少它完全。

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

于 2011-05-19T17:23:09.680 回答