Может ли кто-нибудь объяснить, почему я не могу использовать шаблоны C++ следующим образом:
template <typename T> class A {
public:
typedef std::vector<T>::iterator myiterator;
A(T value)
: v(10, value)
{
}
myiterator begin()
{
return v.begin();
}
myiterator end()
{
return v.end();
}
public:
std::vector<T> v;
};
int main()
{
A<int> a(10);
for (auto i = a.begin(); i != a.end(); ++i)
std::cout << *i << std::endl;
return 0;
}
Я получил ошибку компиляции в строке, где объявлен псевдоним myiterator; ошибка: "missing"; перед идентификатором 'myiterator' ".
+ Изменить
typedef std::vector<T>::iterator myiterator;
в
typedef typename std::vector<T>::iterator myiterator;
Поскольку вы получаете доступ к типу через шаблонный тип (вектор), вам нужно помочь компилятору устранить неоднозначность. vector<T>::iterator
может быть либо статическим членом, либо типом. Без знания T компилятор не может быть уверен. Использование ключевого слова typename
говорит компилятору "рассматривать это как тип".
Для получения дополнительной информации см. Раздел Где и почему мне нужно поставить ключевые слова "шаблон" и "имя-тип"?
Компилятор должен знать, что std::vector
- это тип, зависящий от него:
typedef typename std::vector<T>::iterator myiterator;
Я получаю полезное сообщение об ошибке:
'std::vector<T>::iterator' : dependent name is not a type
prefix with 'typename' to indicate a type
Вам нужно сказать, что вы объявляете тип:
typedef typename std::vector<T>::iterator myiterator;
// ^^^^^^^^
typename
.