for (typename T::const_iterator it = list.begin(); it != list.end(); ++it, ++index)
должен решить вашу проблему.
При использовании зависимых типов (типов в зависимости от параметров шаблона) компилятор не знает, что const_iterator
является типом, пока он не создает экземпляр шаблона с конкретным типом, он также может быть просто статической переменной или чем-то еще. Используя ключевое слово typename
, вы говорите ему, что const_iterator
действительно тип.
В C ++ 11 вы также можете обойти всю проблему typename
, используя ключевое слово auto
:
for (auto it = list.begin(); it != list.end(); ++it, ++index)
Если у вас уже есть итератор (возможно, из какой-то другой операции), вы также можете просто вычислить расстояние от начала списка до этого итератора:
#include <iterator>
int index = std::distance(list.begin(), it);
Но поскольку это имеет линейную сложность для std::list
, лучше использовать самодельную функцию find_index
, чем std::find
, а затем std::distance
, по крайней мере с точки зрения производительности.