0

We are trying to write a really simple class, for complex numbers jsut as an example, and we do not get very far...

Below is our 3 files.

complex2.h

#include<iostream>
#include<new>

template<class T>
class complex2
{
private:
   T re, im; // real and imaginary part
public:
    complex2();
    complex2(T re_a =0.0, T im_a =0.0); //= 0.0 = 0.0

    ~complex2() {}
    T Re () const;
    T Im () const;
};

#endif // COMPLEX2_H

complex2.cpp

#include "complex2.h"

template<class T>
complex2<T>:: complex2 () {re = im = 0.0; }

template<class T>
complex2<T>:: complex2(T re_a, T im_a){re = re_a; im = im_a;}

template<class T> T complex2<T>:: Re() const { return re;}

template<class T> T complex2<T>:: Im() const {return im;}

main.cpp

#include <iostream>
#include<cmath>
#include"complex2.h"

using namespace std;

int main()
{
    complex2<int> b(1, 2);//
    cout << "Re b: "<< b.Re() << "Im b: "<< b.Im() << endl;
    return 0;
}

Running the above from Qt, gives the error messages

/home...main.cpp:10: error: undefined reference to `complex2<int>::complex2(int, int)'

/home/.../main.cpp:11: error: undefined reference to `complex2<int>::Im() const'

/home/...main.cpp:11: error: undefined reference to `complex2<int>::Re() const'

:-1: error: collect2: error: ld returned 1 exit status

Does anybody see how we can make this work?

KJA
  • 313
  • 3
  • 14

1 Answers1

1

I think this post solves your problem: Why can templates only be implemented in the header file?

The way in which template classes are split between header and source is somehow tricky...

Regards