Цикл должен быть
for(typename T::iterator it = container.begin(); it!=container.end(); it++)
myvector.push_back((R)(*it).template get<N>());
В противном случае компилятор будет обрабатывать T::iterator
как не тип (во время анализа он еще не знает, что будет T::iterator
позже!) и, вероятно, проанализирует его как единственную составляющую выражения.Далее следует it
, что является бессмысленным для компилятора, поэтому он ожидает ;
перед ним.
typename
используется, чтобы сообщить компилятору, что определенное квалифицированное имя предназначено для обозначения типа вместозначение (функция / статический член данных / и т. д.).
Второй вопрос, который решается добавлением template
, аналогичного типа.Он сообщает компилятору, что get
является шаблоном и, следовательно, <N
- это не сравнение с N
, а начало списка аргументов шаблона.