未在模板化函数/类中使用stl容器

时间:2009-05-09 16:45:07

标签: c++ stl templates

当我尝试编译以下代码时......

#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我实际上是在尝试编写一个模板化的类,并且遇到地图而不是向量的问题,但这是我问题的最简单的测试用例。

3 个答案:

答案 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 ...让我的关键字混乱。