2010-06-30 2 views
1

У меня есть класс шаблона, который содержит std::map, который хранит указатели на Т, которое отказывается компилировать:станд :: Карта :: const_iterator ошибка шаблон компиляции

template <class T> 
class Foo 
{ 
public: 
    // The following line won't compile 
    std::map<int, T*>::const_iterator begin() const { return items.begin(); } 

private: 
    std::map<int, T*> items; 
}; 

НКУ дает мне следующую ошибку:

error: type 'std::map<int, T*, std::less<int>, std::allocator<std::pair<const int, T*> > >' is not derived from type 'Foo<T>' 

Аналогично, следующий также отказывается компилировать:

typedef std::map<int, T*>::const_iterator ItemIterator;

Однако, используя карту, которая не содержит тип шаблона хорошо работает, например .:

template <class T> 
class Foo 
{ 
public: 
    // This is OK 
    std::map<int, std::string>::const_iterator begin() const { return items.begin(); } 

private: 
    std::map<int, std::string> items; 
}; 

Я предполагаю, что это связано с шаблонами и возникает вопрос - как я могу вернуть const_iterator на мою карту?

ответ

12

typename Использование:

typename std::map<int, T*>::const_iterator begin() const ... 

Когда это сначала передается компилятором, он не знает, что T есть. Таким образом, он также не знает, что const_iterator действительно является типом или нет.

Такие зависимые имена (в зависимости от параметра шаблона) предполагаются

  • не являются типами, если не предваряется typename
  • не быть шаблоны, если прямо не предваряется template.
+0

+1 для полноты. К счастью, 'template' не ползут так часто. –

+0

Ack! Я попробовал typename, но поставил его в неправильное место. Спасибо, Георг. – Rob

2

Вам нужно typename:

typename std::map<int, T*>::const_iterator begin() const { return items.begin(); } 
1

Понадобится:

typename std::map<int, T*>::const_iterator begin() const { return items.begin(); } 

Или проще

typedef typename std::map<int, T*>::const_iterator const_iterator; 
const_iterator begin() const { return items.begin(); } 

Это происходит потому, что const_iterator зависит имя на T, так что вы должны сказать компилятор, что он на самом деле типа.

Смежные вопросы