divya_rathore_@gmail.com wrote:[color=blue]
> I have a problem regarding template classes. I am trying to write a
> template class which allocates dynamic memory for 2D/3D arrays.
> Consider a template class to allocate a 2D array:
>
> //DynAlloc.h
> template <class T>
> class CADynamicAllocator
> {
>
> public:
> CADynamicAllocator();[/color]
You declared this member (the default constructor) but you haven't
defined it. Where is its body?
[color=blue]
> virtual ~CADynamicAllocator();[/color]
You declared this member (the destructor) but you haven't defined it.
Where is its body?
[color=blue]
> public:
> T** Allocate2DArray(T** array, int width, int height);
> DeAllocate2DArray(T** array, int width, int height);
> };
>
> template <class T>
> T** CADynamicAllocator<T>::Allocate2DArray(T** array, int width, int
> height)
> {
> // No. of rows = 'height'
> // No. of cols = 'width'
> int y;
> //Firstly, allocate height.
> array = new T*[height];
> //And then the width..
> for (y=0; y<height; y++) array[y] = new T[width];
>
> return array;
> }
>
>
> And now consider the usage in main.cpp
>
> //main.cpp
> #include "DynAlloc.h"
> int main()
> {
> [...]
> CADynamicAllocator<float> dynAlloc;[/color]
You create an object of this type. The compiler needs a way to
construct the object. You declared the default constructor. The
compiler sees its declaration and creates the code to invoke it.
The compiler aldo needs a destructor to clean up after 'main' exits.
Since you declared the destructor, the compiler creates code to
invoke it as well.
[color=blue]
> [...]
> }
>
> Now the Error message that the compiler (vc++ 6.0) is giving:
>
> unresolved external symbol "public: virtual __thiscall
> CADynamicAllocator<float>::~CADynamicAllocator<flo at>(void)"
> (??1?$CADynamicAllocator@M@@UAE@XZ)
>
> error LNK2001: unresolved external symbol "public: float * * *
> __thiscall CADynamicAllocator<float>::Allocate3DArray(float * *
> *,int,int,int)"
> (?Allocate3DArray@?$CADynamicAllocator@M@@QAEPAPAP AMPAPAPAMHHH@Z)
>
> error LNK2001: unresolved external symbol "public: __thiscall
> CADynamicAllocator<float>::CADynamicAllocator<floa t>(void)"
> (??0?$CADynamicAllocator@M@@QAE@XZ)
>
> What are the syntax (among any other) issues that I am missing here?[/color]
You're missing the fact that both the default constructor and the
destructor need to be implemented.
V