-2
main.o: In function `main':
main.cpp:(.text+0x2f): undefined reference to `Foo<int>::display(int)'
collect2: ld returned 1 exit status

caused by

g++ -c *.cpp && g++ *.o -o foo

with foo.hpp:

#ifndef FOO_H_
#define FOO_H_

template<typename T>
class Foo {
  private:
    T ft_;
  public:
    Foo(const T & ft) : ft_(ft) { }
    Foo display(T x);
};

#endif

foo.cpp:

#include "foo.hpp"
#include<iostream>
using namespace std;

template<typename T>
Foo<T> Foo<T>::display(T x) {
  // do some stuff - not too relevant
  cout << "[" << x << "]";
  Foo<T> res(x);
  return res;
}

and main.cpp:

#include<iostream>
#include "foo.hpp"
using namespace std;

int main() {
  Foo<int> f(42);
  Foo<int> g = f.display(39);
  return 0;
}

Why?!

P. S. Works with inlined function definitions. Troubles come whenever declaration and definition of a function is split into two files...

mathemage
  • 356
  • 3
  • 11

1 Answers1

3

In C++ you need to put the definition of templated methods and functions into the header file.

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
Ivaylo Strandjev
  • 69,226
  • 18
  • 123
  • 176