可能重复:我必须在依赖名称上放置“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 回答
虽然你需要经历很多事情 . 所以 - 尽可能简单地说 - 重点是编译器确实知道
T
是你所说的类型,但是使用那些信息甚至已经看到包含的std::set
源代码,它无法确定是否set<T>
中的iterator
标识符将命名类型,函数或变量 . 这可能看起来很令人惊讶,好像你看一下你可以解决的set<>
模板,但是请记住,在解析你的f<>()
模板的编译器和实例化之前的某个地方,可以指定set<T>
的特殊化,它使用非类型的标识符,或完全缺乏它 .所以,
typename
关键字只是告诉编译器,嘿 - 无论发生什么,你都可以期望iterator
命名一个类型,并在此基础上执行一些f<>()
模板代码的验证,而无需等待实例化 .