Undefined reference to function but it has been defined?

Mar 30, 2018 at 9:31am
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 Mar 30, 2018 at 9:38am
Mar 30, 2018 at 10:05am
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.
Mar 30, 2018 at 10:20am
So if I am understanding you correctly all the function definitions are to be put in the header files?
Mar 30, 2018 at 10:21am
Yes.
Mar 30, 2018 at 10:29am
Thank you Peter
Mar 30, 2018 at 10:54am
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 Mar 30, 2018 at 10:54am
Mar 30, 2018 at 11:22am
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 Mar 30, 2018 at 11:22am
Mar 30, 2018 at 11:53am
"defined at the point where it is used" -> got you!!
Mar 30, 2018 at 3:24pm
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).
Mar 30, 2018 at 4:39pm
@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.
Mar 31, 2018 at 6:42pm
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 Mar 31, 2018 at 6:43pm
Topic archived. No new replies allowed.