Help | Site Map
Connecting Tech Pros Worldwide
 
 
LinkBack Thread Tools
  #1  
Old December 26th, 2005, 08:35 AM
divya_rathore_@gmail.com
Guest
 
Posts: n/a
Default template class to alloc memory

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();
virtual ~CADynamicAllocator();
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()
{
float*** array3D = NULL;
int x,y,z;
x=y=z=10;
CADynamicAllocator<float> dynAlloc;
m_Stack = dynAlloc.Allocate3DArray(m_Stack,x,y,z);

}

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?
Any adivce would be really appreciated.

regards,
D. Rathore

  #2  
Old December 26th, 2005, 06:05 PM
Victor Bazarov
Guest
 
Posts: n/a
Default Re: template class to alloc memory

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


 

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over network members.
Post your question now . . .
It's fast and it's free

Popular Articles