当我尝试编译以下代码时......
#include <vector>
template <class T> void DoNothing()
{
std::vector<T>::iterator it;
}
int main(int argc, char**argv)
{
return 0;
}
g ++说:
test.cpp:5:错误:预期`;'之前 “它”
我不明白为什么这是一个问题。如果我用std::vector<int>::iterator
替换它,比如说,它可以正常工作。
正如您所看到的,我没有实例化该函数,因此g ++必须对模板定义本身有问题,但我看不出它是如何无效的。
感谢您提供有关最新情况的任何建议。
NB我实际上是在尝试编写一个模板化的类,并且遇到地图而不是向量的问题,但这是我问题的最简单的测试用例。
答案 0 :(得分:7)
您需要使用typename
关键字,因为std::vector<T>::iterator
类型取决于模板参数:
template <class T> void DoNothing()
{
typename std::vector<T>::iterator it;
}
当您需要使用typename
以及何时不需要(或甚至不允许使用它)时,实际上可能会造成混淆。本文有一个不错的概述:
答案 1 :(得分:1)
我同意这令人困惑。如果没有typename
关键字,该名称将被视为静态成员。 Vandevoorde和Josuttis撰写的 C ++模板一书详细解释了这一点。
答案 2 :(得分:0)
typename std::vector<T>::iterator it;
是否有效?
编辑:将template
更改为typename
...让我的关键字混乱。