[TriLUG] OT: A C++ Templated Class Problem

Owen Berry oberry at trilug.org
Fri Apr 14 12:17:16 EDT 2006


I think you need to inline all your template functions. In other words,
all your code needs to be in the header file.

Owen

On Fri, Apr 14, 2006 at 12:06:15PM -0400, Randy Barlow wrote:
> Greetings all, I am trying to create a matrix class in C++ that will 
> work with any type (i.e. templated).  The code I have seems to compile 
> just fine, but I am getting the dreaded "unresolved external symbol" 
> linker errors.  The weird thing is that if I hard code the type to 
> double instead of making the class templated, the project seems to work 
> just fine.  But I'll get the linker errors for the templated type.  
> (This problem seems to exist under Windows and Linux both)  Here's my 
> header file:
> 
> template <typename T>
> class matrix {
> private:
>    T* myMatrix;
>    int xsize, ysize, zsize;
> 
> public:
>    matrix(void);
>    ~matrix(void);
> 
>    //set size of the Matrix
>    void setSize(int x, int y, int z);
>    void setSize(int x, int y);
>    void setSize(int x);
> 
>    //Set all of the values of the matrix to the initialValue
>    void initialize(T initialValue);
> 
>    //how to access individual members
>    T& operator() (int a, int b, int c);
>    T& operator() (int a, int b);
>    T& operator() (int a);
> };
> 
> And for those who are interested, here's the .cpp file that goes along 
> with it:
> 
> #include "matrix.h"
> 
> template <typename T>
> matrix<T>::matrix() {
>    xsize = 0;
>    ysize = 0;
>    zsize = 0;
> }
> 
> template <typename T>
> matrix<T>::~matrix() {
>    delete [] myMatrix;
> }
> 
> template <typename T>
> void matrix<T>::setSize(int x, int y, int z) {
>        xsize = x;
>        ysize = y;
>        zsize = z;
>        myMatrix = new T[xsize*ysize*zsize];
> }
> 
> template <typename T>
> void matrix<T>::setSize(int x, int y) {
>    xsize = x;
>    ysize = y;
>    zsize = 0;
>    myMatrix = new T[xsize*ysize];
> }
> 
> template <typename T>
> void matrix<T>::setSize(int x) {
>    xsize = x;
>    ysize = 0;
>    zsize = 0;
>    myMatrix = new T[xsize];
> }
> 
> //Set all of the values of the matrix to the initialValue
> template <typename T>
> void matrix<T>::initialize(T initialValue) {
>    for(int i=0; i<xsize; i++) {
>        for(int j=0; j<ysize; j++) {
>            for(int k=0; k<zsize; k++) {
>                (*this)(i,j,k) = initialValue;
>            }
>        }
>    }
> }
> 
> //how to access individual members
> template <typename T>
> T& matrix<T>::operator() (int a, int b, int c) {
>    if(a>=0 && a<xsize && b>=0 && b<ysize && c>=0 && c<zsize)
>        return myMatrix[a+b*xsize+c*xsize*ysize];
>    else {
>        std::cout << "Error: Exceeded matrix dimensions!" << std::endl;
>        return myMatrix[0];
>    }
> }
> 
> template <typename T>
> T& matrix<T>::operator() (int a) {
>    if(a>=0 && a<xsize && ysize == 0 && zsize == 0)
>        return myMatrix[a];
>    std::cout << "Error: Exceeded matrix dimensions!" << std::endl;
>    return myMatrix[0];
> }
> 
> template <typename T>
> T& matrix<T>::operator() (int a, int b) {
>    if(a>=0 && a<xsize && b>=0 && b<ysize && zsize == 0)
>        return myMatrix[a+b*xsize];
>    std::cout << "Error: Exceeded matrix dimensions!" << std::endl;
>    return myMatrix[0];
> }
> 
> Keep in mind that this thing is still under development (I plan to 
> implement exceptions instead of the cout statements, those are just for 
> the debugging :))  Anyways, would appreciate any help you can offer!
> 
> Randy
> 
> -- 
> TriLUG mailing list        : http://www.trilug.org/mailman/listinfo/trilug
> TriLUG Organizational FAQ  : http://trilug.org/faq/
> TriLUG Member Services FAQ : http://members.trilug.org/services_faq/
> 



More information about the TriLUG mailing list