Frank
Frank

Reputation: 66244

Templated member function with typedef return value

Why does the following code give me an error (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;
}

The error is:

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

How am I supposed to define the Foo<A>::foo() function otherwise (with the correct return type)?

Upvotes: 11

Views: 3894

Answers (3)

Johannes Schaub - litb
Johannes Schaub - litb

Reputation: 507343

The usual typename issue:

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

Remember: As a general rule, all qualified names that depend on a template parameter need typename before them.

Upvotes: 13

ASk
ASk

Reputation: 4187

This is an issue called "two-stage lookup". Basically, since A is a template parameter in foo()'s definition, the compiler can't know when parsing the template for the first time, whether Foo<A>::AVec is a type or even exists (since, for instance, there may exist a specialization of Foo<Bar> which doesn't contain the typedef at all). It will only know what it is during template instantiation, which happens later - and it's too late for this stage.

The correct way would be to use the typename keyword to indicate that this is a type:

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

Upvotes: 20

Javier
Javier

Reputation: 4623

I don't really know, but try putting the typedef outside of the class.

Upvotes: -2

Related Questions