2014-01-05 3 views
5

В C++ я пытаюсь получить std::vector::iterator для моего шаблона. Однако, когда я его компилирую, я получаю ошибки: error C2146: syntax error : missing ';' before identifier 'iterator', error C4430: missing type specifier - int assumed. Note: C++ does not support default-int. Я также получаю предупреждение: warning C4346: 'std::vector<T>::iterator' : dependent name is not a type:C++ template std :: vector :: ошибка итератора

#include <vector> 
template<class T> class v1{ 
    typedef std::vector<T>::iterator iterator; // Error here 
}; 
class v2{ 
    typedef std::vector<int>::iterator iterator; // (This works) 
}; 

Я даже попытался

template<typename T> class v1{ 
    typedef std::vector<T>::iterator iterator; 
}; 

И

template<typename T = int> class v1{ 
    typedef std::vector<T>::iterator iterator; 
}; 
+0

возможно дубликат [? Где и почему я должен поставить «шаблон» и «TYPENAME» ключевые слова] (http://stackoverflow.com/ вопросы/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords) – juanchopanza

+1

Известно, что clang ++ имеет довольно приличные сообщения об ошибках, особенно для таких ошибок. В этом случае он говорит * error: missing 'typename' до имени зависимого типа 'std :: vector :: iterator' *. Я рекомендую попробовать clang (например, в онлайн-компиляторе), если вы не можете понять сообщение об ошибке другого компилятора. – dyp

+0

@DyP GCC имеет похожие сообщения об ошибках. – Rapptz

ответ

21

std::vector<T>::iterator является dependent name, так что вам нужно typename здесь, чтобы указать, что это относится к типу. В противном случае предполагается, относится к не-типа:

typedef typename std::vector<T>::iterator iterator; 
Смежные вопросы