Ошибка компиляции шаблона std :: map :: const_iterator - PullRequest
1 голос
/ 30 июня 2010

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

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;
};

gcc выдает мне следующую ошибку:

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 на мою карту?

Ответы [ 3 ]

12 голосов
/ 30 июня 2010

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

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

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

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

  • не может быть типами, если с префиксом typename
  • не должно быть шаблонами, если непосредственно не указан префикс template.
2 голосов
/ 30 июня 2010

Вам нужно typename:

typename std::map<int, T*>::const_iterator begin() const { return items.begin(); }
1 голос
/ 30 июня 2010

Вам нужно:

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, поэтому вам нужно сообщить компилятору, что это на самом деле тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...