Ошибка компиляции при использовании шаблонов C ++

0

Может ли кто-нибудь объяснить, почему я не могу использовать шаблоны 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' ".

Теги:
templates
compiler-errors

3 ответа

4
Лучший ответ

+ Изменить

typedef std::vector<T>::iterator myiterator;

в

typedef typename std::vector<T>::iterator myiterator;

Поскольку вы получаете доступ к типу через шаблонный тип (вектор), вам нужно помочь компилятору устранить неоднозначность. vector<T>::iterator может быть либо статическим членом, либо типом. Без знания T компилятор не может быть уверен. Использование ключевого слова typename говорит компилятору "рассматривать это как тип".

Для получения дополнительной информации см. Раздел Где и почему мне нужно поставить ключевые слова "шаблон" и "имя-тип"?

  • 0
    Да, это работает! Но почему «typedef» здесь недостаточно? Почему я должен указать дополнительное ключевое слово typename?
  • 1
    C ++ - сложный монстр, поэтому;) Каждый раз, когда вы хотите получить доступ к типу, который зависит от параметра шаблона, вам нужно typename .
2

Компилятор должен знать, что std::vector - это тип, зависящий от него:

typedef typename std::vector<T>::iterator myiterator;
1

Я получаю полезное сообщение об ошибке:

 'std::vector<T>::iterator' : dependent name is not a type
          prefix with 'typename' to indicate a type

Вам нужно сказать, что вы объявляете тип:

typedef typename std::vector<T>::iterator myiterator;
//      ^^^^^^^^

Ещё вопросы

Сообщество Overcoder
Наверх
Меню