Undefined reference to function but it has been defined?

Here is the main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  #include <iostream>
#include "orderedLinkedList.h"
#include "LinkedListType.h"
#include "LinkedListIterator.h"

using namespace std;
int main()
{
    orderedLinkedList<int> list1, list2;
   // orderedLinkedList<int> list1, list2;
    int num;
    cout << "Line 7: Enter numbers ending " << "with -999." << endl;
    cin >> num;
    while (num != -999)
    {
        list1.insert(num);
        cin >> num;
    }

    cout << endl;

    cout << "Line 15: list1: ";
    list1.print();
    cout << endl;

    list2 = list1;

    cout << "Line 19: list2: ";
    list2.print();
    cout << endl;

    cout << "Line 22: Enter the number to be "
        << "deleted: ";

    cin >> num;
    cout << endl;

    list2.deleteNode(num);

    cout << "Line 26: After deleting "
        << num << ", list2: " << endl;

    list2.print();
    cout << endl;

    return 0;
}


First error is in line 16 where it says undefined reference to 'orderedLinkedList<int>::insert(int const&)
but the function has been declared in the header:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef ORDEREDLINKEDLIST_H
#define ORDEREDLINKEDLIST_H

#include "LinkedListType.h"
#include "LinkedListIterator.h"

using namespace std;


template <class Type>
class orderedLinkedList: public LinkedListType<Type>
{
    public:
        bool search(const Type& searchItem) const;
       
    void insert(const Type& newItem);
    
    void insertFirst(const Type& newItem);
        .
    void insertLast(const Type& newItem);
     
    void deleteNode(const Type& deleteItem);
      
    protected:
    private:
};

#endif // ORDEREDLINKEDLIST_H




and defined in .cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "orderedLinkedList.h"
#include "LinkedListType.h"
#include "LinkedListIterator.h"
#include <iostream>

using namespace std;

template <class Type>
bool orderedLinkedList<Type>::search(const Type& searchItem) const
{
    bool found = false;
    nodeType<Type> *current; //pointer to traverse the list
    current = this->first; //start the search at the first node
    while (current != NULL && !found)
        if (current->info >= searchItem)
            found = true;
        else
            current = current->link;
        if (found)
            found = (current->info == searchItem); //test for equality
        return found;
}//end search

template <class Type>
void orderedLinkedList<Type>::insert(const Type& newItem)
{
    nodeType<Type> *current; //pointer to traverse the list
    nodeType<Type> *trailCurrent; //pointer just before current
    nodeType<Type> *newNode; //pointer to create a node

    bool found;

    newNode = new nodeType<Type>; //create the node
    newNode->info = newItem; //store newItem in the node
    newNode->link = NULL; //set the link field of the node
                        //to NULL
    if (this->first == NULL) //Case 1
    {
        this->first = newNode;
        this->last = newNode;
        this->count++;
    }
    else
    {
    current = this->first;
    found = false;
    while (current != NULL && !found) //search the list
        if (current->info >= newItem)
        found = true;
    else
        {
        trailCurrent = current;
        current = current->link;
        }
    if (current == this->first) //Case 2
        {
            newNode->link = this->first;
            this->first = newNode;
            this->count++;
        }
      else //Case 3
    {
        trailCurrent->link = newNode;
        newNode->link = current;
            if (current == NULL)
                this->last = newNode;
                this->count++;
            }
        }//end else
}//end insert

template <class Type>
void orderedLinkedList<Type>::insertFirst(const Type& newItem)
{
    insert(newItem);
}//end insertFirst

template <class Type>
void orderedLinkedList<Type>::insertLast(const Type& newItem)
{
    insert(newItem);
}//end insertLast

template <class Type>
void orderedLinkedList<Type>::deleteNode(const Type& deleteItem)
{
    nodeType<Type> *current; //pointer to traverse the list
    nodeType<Type> *trailCurrent; //pointer just before current
    bool found;
    if (this->first == NULL) //Case 1
        cout << "Cannot delete from an empty list." << endl;
    else
    {
        current = this->first;
        found = false;
        while (current != NULL && !found) //search the list
        if (current->info >= deleteItem)
            found = true;
        else
        {
            trailCurrent = current;
            current = current->link;
        }
        if (current == NULL) //Case 4
            cout << "The item to be deleted is not in the list."
            << endl;
        else
            if (current->info == deleteItem) //the item to be
            //deleted is in the list
            {
                if (this->first == current) //Case 2
                {
                    this->first = this->first->link;
                    if (this->first == NULL)
                    this->last = NULL;
                    delete current;
                }
                    else //Case 3
                    {
                    trailCurrent->link = current->link;
                    if (current == this->last)
                    this->last = trailCurrent;
                    delete current;
                    }
                this->count--;
            }
            else //Case 4
                    cout << "The item to be deleted is not in the "
                        << "list." << endl;
                        }
}//end deleteNode

Last edited on
Templated code need to be fully defined at the point where it is used so you are more or less forced to put the functions in the header. This will not give you multiple definition errors because the rules for templates are different compared to regular functions.
So if I am understanding you correctly all the function definitions are to be put in the header files?
Yes.
Thank you Peter
Any idea why it would say "redefinition of 'function'" when defintion is placed in header file and initial .cpp file commented out?
Last edited on
Ok, after putting the definitions of the function in the header (and got errors), i put it in main file and it worked!
Last edited on
"defined at the point where it is used" -> got you!!
That was not what I intended with those words. It should work if you put them in the header. Make sure you put it inside the include guard (before the #endif).
@redman008, yeah, Peter's saying no orderedLinkedList.cpp at all (everything there moved to orderedLinkedList.h). Also main.cpp should probably only have the single include, #include "orderedLinkedList.h" -- main doesn't care about the linkedlist parents since it's not using them.
Yes peter and icy. This is how I initially understood it, but try as I may, it didnt work. I will now see what i did wrong because as you guys say it should work in header with only the single #include "orderedLinkedList.h" in main

Thanks for feedback
Last edited on
Topic archived. No new replies allowed.