Эта проблема называется " двухэтапный поиск ". По сути, поскольку 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;
}