1

as a beginner, I was practicing C++ programming by building a program with one header file but I have been stuck in one problem for several hours.

My program has very simple structure:

main.cpp, which includes function, int main()

chain.hpp, which includes declaration of classes and functions

chain.cpp, which includes detailed definition of each functions

// main.cpp
#include <iostream>
#include "chain.hpp"
using namespace std;

int main(int argc, const char * argv[]) {
    // insert code here...
    Chain<int> linkedlist;
    linkedlist.insertNode(0, 123);
}
// Chain.hpp
#ifndef chain_hpp
#define chain_hpp

#include <stdio.h>

template<class T>
class ChainNode{
public:
    ChainNode<T>* next;
    T data;
    
    ChainNode(){next=NULL; data=NULL;}
    ChainNode(ChainNode<T>* next, T data);
    ~ChainNode();
private:
};

template<class T>
class Chain{
private:
    ChainNode<T>* first;
public:
    Chain(){first=NULL;}
    ~Chain();
    int indexOf(const T& element) const;
    void deleteNode(int index);
    void insertNode(int index, const T& element);
    bool isEmpty() const {return first==0;}
};

#endif /* chain_hpp */
// chain.cpp
#include "chain.hpp"

template<class T>
ChainNode<T>::ChainNode(ChainNode<T>* next, T data){
    this->next = next;
    this->data = data;
}

template<class T>
ChainNode<T>::~ChainNode(){
    delete this;
}


template<class T>
Chain<T>::~Chain(){
    while(first!=NULL){
        ChainNode<T>* next = first->next;
        delete first;
        first = next;
    }
}

template<class T>
int Chain<T>::indexOf(const T& element) const{
    ChainNode<T>* current = first;
    int index = 0;
    while(current!=NULL && current->data){
        current = current->next;
        index++;
    }
    if(current==NULL) return -1;
    return index;
}

template<class T>
void Chain<T>::deleteNode(int index){
    if(index<0) throw "Negative index cannot be input";
    if(first ==0) throw "Empty chain";
    
    ChainNode<T>* deleteNode = first;
    ChainNode<T>* beforeNode = first;
    if(index==0){
        first = first->next;
    }
    else{
        for(int i=0;i<index-1;i++){
            if(beforeNode==NULL) throw "Index is bigger than length of the chain";
            beforeNode = beforeNode->next;
        }
        deleteNode = beforeNode->next;
        beforeNode->next = beforeNode->next->next;
    }
    delete deleteNode;
}

template<class T>
void Chain<T>::insertNode(int index, const T& element){
    if(index<0) throw "Negative index cannot be input";
    if(first==0) throw "Empty chain";
    
    ChainNode<T>* newnode = new ChainNode<T>();
    if(index==0){
        newnode->next = first;
        first = newnode;
    }
    else{
        ChainNode<T>* beforenode = first;
        for(int i=0;i<index-1;i++){
            if(beforenode==NULL) throw "Index is bigger than length of the chain";
            beforenode = beforenode->next;
        }
        newnode->next = beforenode->next;
        beforenode->next = newnode;
    }
}

And error messages are as below

Undefined symbols for architecture x86_64:
  "Chain<int>::insertNode(int, int const&)", referenced from:
      _main in main.o
  "Chain<int>::~Chain()", 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)

I know myself that there might be further problems to be fixed, but due to this build time error, I cannot step to that level.

Since I was using Xcode for my programming, I suspected Xcode itself might be the reason of this problem, but even when I tried compiling through my terminal and g++ *.cpp command, the same error message was annoying me. Is there any expert who can help me stop wasting my time?

Community
  • 1
  • 1
LisaLee
  • 11
  • 1
  • 1
    Templates must be implemented in header files. Please, remember that templates are not the ready code, they are used by compiler to build the actual code. Hence, every translation unit (compiled cpp file) which uses the template must "see" the implementation. (I'm looking for a dupl. because this was already asked before.) – Scheff's Cat Oct 06 '19 at 10:04

0 Answers0