Несоответствие типа/значения в шаблоне. Объявление класса С++.

Я пытаюсь скомпилировать следующий код в Linux с помощью gcc 4.2:

#include <map>
#include <list>

template<typename T>
class A
{
...

private:
    std::map<const T, std::list<std::pair<T, long int> >::iterator> lookup_map_;
    std::list<std::pair<T, long int> > order_list_;

};

Когда я компилирую этот класс, я получаю следующее сообщение из gcc:

error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’
error:   expected a type, got ‘std::list<std::pair<const T, long int>,std::allocator<std::pair<const T, long int> > >::iterator’
error: template argument 4 is invalid

Я удалил имена файлов и номера строк, но все они относятся к строке, объявляющей карту.

Когда я заменяю пару в этих выражениях на int или какой-то конкретный тип, он компилируется отлично. Может кто-нибудь, пожалуйста, объясните мне, что я делаю неправильно.

Ответ 1

Вам нужно написать typename до std::list<...>::iterator, потому что iterator - это вложенный тип, и вы пишете шаблон.

Изменить: без typename, GCC предполагает (как требует стандарт), что iterator фактически является статической переменной в list, а не типом. Следовательно, ошибка "несоответствие типа параметра".

Ответ 2

Для вашего кода требуется ключевое слово "typename".

    std::map<const T, typename std::list<std::pair<T, long int> >::iterator> lookup_map_;