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

StackOverflow https://stackoverflow.com/questions/20090172

  •  02-08-2022
  •  | 
  •  

Question

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

Was it helpful?

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) { ... }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top