Шаблонная функция-член с возвращаемым значением typedef - PullRequest
10 голосов
/ 24 мая 2009

Почему следующий код выдает ошибку (g ++ 4.1.2)?

template<class A>
class Foo {
public:
  typedef std::vector<A> AVec;
  AVec* foo();
};

template<class A>
Foo<A>::AVec* Foo<A>::foo() { // error on this line
  return NULL;
}

Ошибка:

error: expected constructor, destructor, or type conversion before '*' token

Как мне иначе определить функцию Foo<A>::foo() (с правильным типом возврата)?

Ответы [ 3 ]

19 голосов
/ 24 мая 2009

Эта проблема называется " двухэтапный поиск ". По сути, поскольку A является параметром шаблона в определении foo(), компилятор не может знать при первом анализе шаблона, является ли Foo<A>::AVec типом или даже существует (поскольку, например, существует может существовать специализация Foo<Bar>, которая вообще не содержит typedef). Он будет знать только, что это такое во время шаблона создания экземпляра , что происходит позже - и уже слишком поздно для этого этапа.

Правильный способ будет использовать ключевое слово typename, чтобы указать, что это тип:

template<class A>
class Foo {
public:
  typedef std::vector<A> AVec;
  AVec* foo();
};

template<class A>
typename Foo<A>::AVec* Foo<A>::foo() {
  return NULL;
}
13 голосов
/ 24 мая 2009

Обычный typename выпуск:

template<class A>
typename Foo<A>::AVec* Foo<A>::foo() { // error on this line
  return NULL;
}

Помните: Как правило, все квалифицированные имена, которые зависят от параметра шаблона, должны typename перед ними.

0 голосов
/ 24 мая 2009

Я действительно не знаю, но попробуйте поместить typedef вне класса.

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