0

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();
b219
  • 33
  • 4
  • Please add the error message. – cigien Dec 09 '20 at 19:25
  • Thanks for adding the error message. Read the duplicate target for details. If you make your class a template, then you need to write all your definitions in headers. – cigien Dec 09 '20 at 19:28

0 Answers0