954,500 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Undefined reference error

I am trying to implement a queue based on a Linked List that I had to write previously. It is templated and for some reason I am getting the following error using g++ when I compile:

g++ LinkedQueueMain.cpp -o LinkedQueueMain
/tmp/ccqwStpK.o: In function `main':
LinkedQueueMain.cpp:(.text+0x2ee): undefined reference to `LinkedQueue<char>::operator=(LinkedQueue<char> const&)'
collect2: ld returned 1 exit status


It is saying undefined reference however I have declared and defined it so I cant figure out what the problem is.

This is my class declaration and definition: // LinkedQueue.h

#ifndef LINKEDQUEUE_H
#define LINKEDQUEUE_H

#include <iostream>
#include "RuntimeException.h"
#include "LinkedList.h"

template<typename T> class LinkedQueue;

template<typename T>
std::ostream& operator<<(std::ostream& out, const LinkedQueue<T>& queue);

template<typename T>
class LinkedQueue {
private:
LinkedList<T> ll;

public:
// user-defined exceptions
class QueueEmptyException : public RuntimeException {
public:
QueueEmptyException() : RuntimeException("Access to an empty queue") {}
};

LinkedQueue() { } // constructor
~LinkedQueue() { } // destructor
LinkedQueue(const LinkedQueue& queue) { ll = queue.ll; } // copy constructor
LinkedQueue& operator=(const LinkedQueue& queue); // assignment operator

// I have cut out accessory function declarations

friend std::ostream& operator<< <>(std::ostream& out, const LinkedQueue<T>& queue); // overload <<
};

//-------------------------------------------------------------------------------------------------------------------------

template<typename T>
LinkedQueue<T>& LinkedQueue<T>::operator=(const LinkedQueue& queue) {
ll = queue.ll;
return *this;
}

// other functions defined here I just cut them out for space

#endif

Here is my main: #include "LinkedQueue.h"
#include <iostream>
#include <string>
#include <iterator>
using namespace std;

int main()
{
LinkedQueue<char> queue;
LinkedQueue<char> queue_copy;

//===== enqueue() =====

queue.enqueue('1');
queue.enqueue('2');
queue.enqueue('3');
queue.enqueue('4');
queue.enqueue('5');
queue.enqueue('6');

queue_copy = queue; //THIS IS WHERE I BELIEVE THE PROBLEM IS
cerr << "assigning queue to queue_copy, queue_copy = ";
cerr << queue_copy << endl;
cerr << "size of queue_copy = " << queue_copy.size() << endl;
cerr << "first of queue_copy = " << queue_copy.first() << endl << endl;

return 0;
}

Thanks in advance for any help.

chunalt787
Junior Poster in Training
84 posts since Apr 2008
Reputation Points: 39
Solved Threads: 1
 

I am not sure about this , But Why returning (*this)? In your = operator.

Sky Diploma
Practically a Posting Shark
865 posts since Mar 2008
Reputation Points: 673
Solved Threads: 131
 

Are you sure this code works:

ll = queue.ll;

'll' is under private section, right? I'm not sure if you can access it.
Here's my code example if it helps:

//operators
//=
Complex& Complex::operator=(Complex const& aCplx){
    if (this != &aCplx){
        mNum.Im = aCplx.getIm();
        mNum.Re = aCplx.getRe();
    }
    return *this;
}
Sci@phy
Posting Whiz in Training
279 posts since Sep 2008
Reputation Points: 110
Solved Threads: 43
 
I am not sure about this , But Why returning (*this)? In your = operator.


(*this) is returned so you can write things like:
myObjA = myObjB = myObjC;

Sci@phy
Posting Whiz in Training
279 posts since Sep 2008
Reputation Points: 110
Solved Threads: 43
 

Our professor gave us a skeleton of the code and it already had the return statement in it so I didn't change it. The LinkedList = operator overload returns a pointer as well.

chunalt787
Junior Poster in Training
84 posts since Apr 2008
Reputation Points: 39
Solved Threads: 1
 

Are you sure this code works:

ll = queue.ll;

'll' is under private section, right? I'm not sure if you can access it. Here's my code example if it helps:

//operators
//=
Complex& Complex::operator=(Complex const& aCplx){
    if (this != &aCplx){
        mNum.Im = aCplx.getIm();
        mNum.Re = aCplx.getRe();
    }
    return *this;
}

Well the definition is within the class and classes can access their own private data members so ya it should work. I tried putting it in the public section just to check and it did the same thing. As to your example thats basically the same thing that im trying to do. I don't see why mine doesnt work.

chunalt787
Junior Poster in Training
84 posts since Apr 2008
Reputation Points: 39
Solved Threads: 1
 
Well the definition is within the class and classes can access their own private data members so ya it should work. I tried putting it in the public section just to check and it did the same thing. As to your example thats basically the same thing that im trying to do. I don't see why mine doesnt work.


I'm not sure about this.
Function can access IT'S own members (this->memb1; this->memb2;)
But I'm really not sure about accessing other instance of same type...

Maybe your problem is in something else...

Sci@phy
Posting Whiz in Training
279 posts since Sep 2008
Reputation Points: 110
Solved Threads: 43
 

I'm not sure about this. Function can access IT'S own members (this->memb1; this->memb2;) But I'm really not sure about accessing other instance of same type...

Maybe your problem is in something else...


I have done something very similar to that previously so I am pretty sure thats not the problem.

BTW Thanks to everyone thats been trying to help. This is getting really frustrating.

chunalt787
Junior Poster in Training
84 posts since Apr 2008
Reputation Points: 39
Solved Threads: 1
 

Zip and post entire code, please.
It's frustrating me now too :)

Sci@phy
Posting Whiz in Training
279 posts since Sep 2008
Reputation Points: 110
Solved Threads: 43
 

I think its zipped now thats the first time I have done that. I am sorry its been so long. I had an emergency that kept me from the computer for a couple days. Im back now and still annoyed by this error.

Attachments LinkedQueue.zip (1.39KB)
chunalt787
Junior Poster in Training
84 posts since Apr 2008
Reputation Points: 39
Solved Threads: 1
 
template<typename T>
LinkedQueue& LinkedQueue::operator=(const LinkedQueue& queue)
{
	ll = queue.ll;
	return *this;
}

You need to be more careful about specifying template parameters:

template<typename T>
LinkedQueue<T>& LinkedQueue<T>::operator=(const LinkedQueue<T>& queue)
{
	ll = queue.ll;
	return *this;
}
Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

o crap i must have zipped an older version. I had had that and it still didn't work. I just ended up redoing the entire header and now it works so thank you to everyone who helped

chunalt787
Junior Poster in Training
84 posts since Apr 2008
Reputation Points: 39
Solved Threads: 1
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You