Search code examples
c++templatestypename

C++ template in header file, error in implementation-file *.cc "error: expected a class or namespace"


I've specified a header file like this:

04-Templates_foo.h:

template <typename T>

class foo {
    T x, y;
    T getX(void);
    void setX(T x);
};

And an implementation like this:

04-Templates_foo.cc:

#include "04-Templates_foo.h"

template <typename T>
T foo::getX(void) {
    return this->x;
}

void foo::setX(T x) {
    this->x = x;
}

My main routine:

04-Templates.cc

#include <iostream>
#include "04-Templates_foo.cc"

int main (void) {
    // Do nothing because it doesn't even compile...
}

Compiling this code returns this error:

In file included from 04-Templates.cc:2:
./04-Templates_foo.cc:4:3: error: expected a class or namespace
T foo::getX(void) {
  ^
1 error generated.

I can't imagine what the problem is. Why can't I specify the function foo::getX? It's a class name, although the compiler said it is expecting a class and didn't find one :-/

If it may be important. I'm compiling this on a MacBook Pro Retina Mid 2012 with Mavericks. I used this compile-command:

g++ -o 04-Templates 04-Templates.cc

Suggestions for a better title are welcome ;)


Solution

  • In the definition of foo::getX (and setX as well), what kind of foo?

    Because it's a template class, you have to specify that, like

    template<typename T>
    T foo<T>::getX(void) { ... }
    

    You also have to tell the compiler that member functions are templates for each function in a templated class. So you have to do it for setX as well:

    template<typename T>
    void foo<T>::setX(T x) { ... }