Mail Archives: djgpp/1997/06/03/15:34:12
From: | boylesgj AT lion DOT cs DOT latrobe DOT edu DOT au (Gregary J Boyles)
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Template problem.
|
Date: | 3 Jun 1997 15:20:04 GMT
|
Organization: | Comp.Sci & Comp.Eng, La Trobe Uni, Australia
|
Lines: | 234
|
Distribution: | world
|
Message-ID: | <5n1cn4$ns3@lion.cs.latrobe.edu.au>
|
NNTP-Posting-Host: | lion.cs.latrobe.edu.au
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
What am I doing wrong with this friggin template class.?
gxx -fno-implicit-templates test.cc
test.o: In function `main':
test.cc:15: undefined reference to `StackQueueC<int>::StackQueueC(void)'
test.cc:30: undefined reference to `StackQueueC<int>::~StackQueueC(void)'
void main()
{
StackQueueC<int> S;
}
template <class T>
class NodeC
{
public:
// The node's data.
T Data;
// Pointer to the next and previous nodes.
NodeC<T> *Next,*Prev;
// Constructor.
NodeC()
{
Next=Prev=NULL;
};
// Destructor.
~NodeC()
{
Next=Prev=NULL;
};
};
template <class T>
class StackQueueC
{
private:
// The first and last node in the linked list.
NodeC<T> *First,*Last;
// The number of nodes in the list.
int NumNodes;
public:
// Constructor.
StackQueueC(void);
// Detsructor.
~StackQueueC(void);
// Checks for an empty queue or stack.
bool Empty();
// Stack functions.
bool Pop(T &Data);
bool Push(T &Data);
// Queue functions.
bool Enqueue(T &Data);
bool Dequeue(T &Data);
};
// Constructor.
template <class T>
StackQueueC<T>::StackQueueC()
{
First=Last=NULL;
NumNodes=0;
}
// Detsructor.
template <class T>
StackQueueC<T>::~StackQueueC()
{
T Data;
while (!Empty())
Pop(Data);
}
// Checks for an empty queue or stack.
template <class T>
bool StackQueueC<T>::Empty()
{
return NumNodes==0;
}
// Stack functions.
template <class T>
bool StackQueueC<T>::Pop(T &Data)
{
NodeC<T> *Temp=NULL;
bool Result=false;
// If the stack is not empty.
if (!Empty)
{
Temp=First;
if (NumNodes==1)
{
Last=NULL;
First=NULL;
}
else
{
First=Temp->Next;
First->Prev=NULL;
}
Data=Temp->Data;
delete Temp;
NumNodes--;
Result=true;
}
return Result;
}
template <class T>
bool StackQueueC<T>::Push(T &Data)
{
NodeC<T> *Temp=NULL;
bool Result=false;
// Create a new node.
Temp=new NodeC<T>;
// If successful then add the node to the stack.
if (Temp)
{
Temp->Data=Data;
NumNodes++;
Result=true;
if (Empty())
{
Last=Temp;
First=Temp;
}
else
{
Temp->Next=First;
First->Prev=Temp;
First=Temp;
}
}
return Result;
}
// Queue functions.
template <class T>
bool StackQueueC<T>::Enqueue(T &Data)
{
NodeC<T> *Temp=NULL;
bool Result=false;
// Create a new node.
Temp=new NodeC<T>;
// If successful then add the node to the queue.
if (Temp)
{
Temp->Data=Data;
NumNodes++;
Result=true;
if (Empty())
{
Last=Temp;
First=Temp;
}
else
{
Last->Next=Temp;
Temp->Prev=Last;
Last=Temp;
}
}
return Result;
}
template <class T>
bool StackQueueC<T>::Dequeue(T &Data)
{
// Poping is the same as dequeuing
return Pop(Data);
}
#endif
- Raw text -