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/

Reply via email to