lundi 19 mars 2018

Undefined Reference Error with a Generic Singly Linked List [duplicate]

This question already has an answer here:

I've been trying to implement a generic singly linked list in C++. (I'm using Code::Blocks with the GNU GCC Compiler)

main.cpp

#include <iostream>
#include "genNode.h"
#include "genList.h"

using namespace std;


genList<int> myl;

int main()
{

    myl.addFront(5);
    myl.addFront(10);
    myl.display();
    myl.addMiddleFront(8,5);
    myl.addMiddleFront(10,8);
    myl.addMiddleBefore(9,8);
    myl.addMiddleFront(58,15);
    myl.removeFront();
    myl.display();
    myl.removeNode(8);
    myl.addRear(45);
    myl.addRear(78);
    myl.addMiddleBefore(14,78);
    myl.display();

    return 0;
}

genNode.h

#ifndef GENNODE_H_INCLUDED
#define GENNODE_H_INCLUDED

template <typename E>
class genNode{

private:
    E elem;
    genNode<E>* next;
    friend class genList;

public:
    genNode(E value=0) {
        elem= value;
        next= NULL;
    }

};


#endif // GENNODE_H_INCLUDED

genList.h

#ifndef GENLIST_H_INCLUDED
#define GENLIST_H_INCLUDED
#include "genNode.h"

template<typename E>

class genList{

private:
    genNode<E>* head;
public:

    genList(){
        head = NULL;
    }
    ~genList(); //done
    void display(); //done
    bool isEmpty() const;
    const E& getFront() const; //done
    void addFront(const E& e); //done
    void addRear(const E& e);
    void removeFront(); //done
    void addMiddleFront(const E& e, const E& pos);
    void addMiddleBefore(const E&e, const E& pos);
    bool isIn(const E& e);
    void removeNode(const E& e);

};



#endif // GENLIST_H_INCLUDED

genList.cpp

#include <iostream>
#include "genNode.h"
#include "genList.h"

using namespace std;
//check if the list is empty by checking if head = NULL
template <typename E>
bool genList<E>::isEmpty() const{
    if(head == NULL){
        return true;
    }
    else {
        return false;
    }
}

template <typename E>
void genList<E>::display(){
genNode<E> *cur = head;
cout << endl;
while(cur != NULL){
    cout << cur -> elem <<"->";
    cur = cur->next;
}
cout << endl;
}

template <typename E>
void genList<E>::addFront(const E& e){
genNode<E>* temp = new genNode<E>;
temp->elem = e;
temp->next = head;
head = temp;
cout<<"Added element"<<endl;
}

template <typename E>
const E& genList<E>::getFront() const{
    genNode<E> *cur = head;
    cout << "Returning front.."<<endl;
    return cur -> elem;

}

template <typename E>
void genList<E>::addMiddleFront(const E& e, const E& pos){
if(isIn(pos)){
genNode<E>* temp = new genNode<E>;
temp->elem = e;
genNode<E>* travNode = head;
while((travNode->elem) != pos){
    travNode = travNode->next;
}
temp->next = travNode->next;
travNode->next = temp;
}
else{
    cout<<"Elem not in list ha!"<<endl;
}
}

template <typename E>
void genList<E>::addMiddleBefore(const E&e, const E& pos){
if(isIn(pos)){
genNode<E>* temp = new genNode<E>;
temp->elem = e;
genNode<E>* cur = head;
genNode<E>* prev = head;
while((cur->elem) != pos){
    prev = cur;
    cur = cur->next;
}
temp->next = cur;
prev->next = temp;
}
else{
    cout<<"Elem not in list ha!"<<endl;
}
}

template <typename E>
void genList<E>::removeFront(){
if (!isEmpty()){
    genNode<E> *temp = head;
    head = head -> next;
    delete temp;
    cout << "Deleted front"<<endl;
}
else{
    cout << "List is already empty"<<endl;
}
}

template <typename E>
bool genList<E>::isIn(const E& e){
genNode<E>* travNode = head;
while(travNode != NULL){
    if((travNode->elem) == e){
        return true;
    }
    travNode = travNode -> next;
}
return false;
}

template <typename E>
void genList<E>::removeNode(const E& e){
if(!isEmpty()){
    genNode<E>* cur = head;
    genNode<E>* prev = head;
    while((cur->elem) != e){
        prev = cur;
        cur = cur-> next;
    }
    prev->next = cur->next;
    delete cur;
    cout<<"Deleted"<<endl;
}
else{
    cout<<"list is empty"<<endl;
}
}

template <typename E>
void genList<E>::addRear(const E& e){
genNode<E>* temp = new genNode<E>;
temp -> elem = e;

if(!isEmpty()){
   genNode<E>* cur = head;
   while((cur->next) != NULL){
        cur = cur -> next;
   }
        cur->next = temp;
   }
}
//destructor of the class
template <typename E>
genList<E>::~genList() {while (!isEmpty()) removeFront();}

Upon running the code, I get Undefined Reference Errors in main.cpp in the following form for all the functions,

"undefined reference to `genList::addFront(int const&)"

I'm sure that the files are in the same project folder, and I've included the header files in main.cpp. Does anyone have any idea what might be spawning the error?

Thanks in advance!

Aucun commentaire:

Enregistrer un commentaire