Вам нужно поставить typename
перед этой строкой, так как тип, который вы делаете :: итератор, зависит от параметра-шаблона T. Например,
template< class T >
void example() {
typename std::list< boost::function<T ()> >::iterator it;
}
Рассмотрим строку
std::list< boost::function<T ()> >::iterator * it;
что может означать умножение или указатель. Вот почему вам нужно typename
, чтобы прояснить свое намерение. Без него компилятор не принимает тип, и, следовательно, ему требуется оператор там или синтаксически точка с запятой.
Также обратитесь к новой записи C ++ FAQ Где поместить шаблон и имя типа на зависимые имена .