首页 文章

在模板定义中要求typename的原因[重复]

提问于
浏览
2

可能重复:我必须在依赖名称上放置“template”和“typename”的位置和原因?

这是该问题的具体实例: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 需要一个而不是另一个?

1 回答

  • 4

    虽然你需要经历很多事情 . 所以 - 尽可能简单地说 - 重点是编译器确实知道 T 是你所说的类型,但是使用那些信息甚至已经看到包含的 std::set 源代码,它无法确定是否 set<T> 中的 iterator 标识符将命名类型,函数或变量 . 这可能看起来很令人惊讶,好像你看一下你可以解决的 set<> 模板,但是请记住,在解析你的 f<>() 模板的编译器和实例化之前的某个地方,可以指定 set<T> 的特殊化,它使用非类型的标识符,或完全缺乏它 .

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

相关问题