Как я могу получить итератор для вектора шаблонных объектов? - PullRequest
1 голос
/ 26 ноября 2009

У меня очень глупая проблема с кодом, показанным ниже. Цель состоит в том, чтобы увеличивать несколько счетчиков одновременно и печатать их значения после обработки предоставленным функтором.

Однако 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 ]

5 голосов
/ 26 ноября 2009

введите имя типа здесь:

for (typename std::vector<Counter<F> >::iterator it = counters.begin() ;
1 голос
/ 26 ноября 2009

Я думаю, это может быть связано с std::vector<Counter<F> >::iterator как зависимое имя, попробуйте заменить его на
typename std::vector<Counter<F> >::iterator.
Таким образом, компилятор будет игнорировать его, пока он на самом деле не создаст экземпляр шаблона с заданным F.

Здесь ссылка для зависимых имен в C ++

РЕДАКТИРОВАТЬ: после jalf ответить на это ссылка объясняет, что если мы укажем имя типа, компилятор не будет путать имя с переменной, и это причина, по которой оно откладывается, без устранения неоднозначности он будет думать, что это попытка решить эту проблему в этот момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...