I've been searching for hours for real, I couldn't find any where I was wrong. It works when I don't do it as a template, but it gives an error when it is a template. this is header file
#ifndef Queue_h
#define Queue_h
template<class T>
class Queue {
public:
Queue();
~Queue();
bool isEmpty() const;
int size() const;
//Enqueue: Items are added to the back of the queue
void enqueue(const T& newItem);
//Dequeue: Items are removed from the front of the queue
void dequeue();
//Get Front: Take a look at the first item
struct QueueNode {
T item;
QueueNode *next;
};
QueueNode *front_p;
QueueNode *rear_p;
int _size;
};
This is c++ file
#include <stdio.h>
#include "Queue.h"
#include <iostream>
#include <string>
using namespace std;
template <class T>
Queue<T>::Queue():front_p(NULL), rear_p(NULL), _size(0){
};
template <class T>
Queue<T>::~Queue()
{
// dequeue until queue is empty
while ( _size > 0 )
dequeue();
};
template <class T>
bool Queue<T>::isEmpty() const{
return front_p == NULL;
};
template <class T>
int Queue<T>::size() const{
return _size;
};
template <class T>
void Queue<T>::enqueue(const T& newItem)
{
// create a new node
QueueNode *newPtr = new QueueNode;
// set data portion of new node
newPtr->item = newItem;
newPtr->next = NULL;
if ( 0 == _size )
front_p = newPtr;
else
// insert the new node at the rear of the queue
rear_p->next = newPtr;
// in either case set rear to point to new node and increment num_items
rear_p = newPtr;
_size++;
};
template <class T>
void Queue<T>::dequeue(){
if ( 0 == _size )
{
cout<<"empty"<<endl;
return;
}
else {
// queue is not empty;
QueueNode *temp = front_p;
if ( front_p == rear_p ) {
front_p = NULL;
rear_p = NULL;
}
else
front_p = front_p->next;
temp->next = NULL;
delete temp;
_size--;
}
};
This is the main part. The problem starts here, either there is an error in the cpp file or I am initialize it incorrectly.
#include <iostream>
#include <stdio.h>
#include "Queue.h"
#include "SomeClass.h"
using namespace std;
int main(int argc, const char * argv[]) {
Queue<int> q1;
Queue<SomeClass> q2;
return 0;
}
error message
Undefined symbols for architecture x86_64:
"Queue<int>::Queue()", referenced from:
_main in main.o
"Queue<int>::~Queue()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Undefined symbol:queue<int>::Queue();