如何在模板化对象的矢量上获得迭代器?

时间:2009-11-26 15:34:23

标签: c++ templates

我对下面显示的代码有一个非常愚蠢的问题。 目标是一次增加多个计数器,并在由提供的仿函数处理后打印它们的值。

然而g ++抱怨:

test.hpp:32: error: expected `;' before 'it' "

我尝试添加一些typedef,但错误信息仍然存在。这是代码(一大堆代码的简化版)

#include <vector>
#include <iostream>

template <class F>
class Counter
{
    public:
    Counter();
    void increment(int amount);
    private:
    F calc;
    int current_amount;
};

template <class F>
void Counter<F>::increment(int amount)
{
  current_amount += amount;
  std::cout << F(amount) << "\n";
}

template <class F>
class CounterBattery
{
    public:
      CounterBattery();
      void incrementAll(int amount);
    private:
      std::vector<Counter<F> > counters;
};

template <class F>
void CounterBattery<F>::incrementAll(int amount)
{
  for (std::vector<Counter<F> >::iterator it = counters.begin() ; it != counters.end() ; it++) // fails to compile here
    it->increment(amount);
}

我不明白我在这里做错了什么。

感谢您提供的任何帮助

2 个答案:

答案 0 :(得分:5)

在此处插入typename:

for (typename std::vector<Counter<F> >::iterator it = counters.begin() ;

答案 1 :(得分:1)

我认为它可能与std::vector<Counter<F> >::iterator是一个从属名称有关,请尝试用它替换它 typename std::vector<Counter<F> >::iterator
这样编译器将忽略它,直到它实际使用给定的F实例化模板。

这是dependent names in C++

的链接

编辑:关于jalf回答这个link解释说,如果我们指定typename,编译器就不会将名称与变量混淆,这也就是它被推迟的原因,而没有消除它的歧义我认为它的变量会在那时解决它。