[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