0

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.

4
Contributors
11
Replies
12
Views
9 Years
Discussion Span
Last Post by chunalt787
Featured Replies
  • Are you sure this code works: [CODE]ll = queue.ll;[/CODE] 'll' is under private section, right? I'm not sure if you can access it. Here's my code example if it helps: [CODE=cplusplus] //operators //= Complex& Complex::operator=(Complex const& aCplx){ if (this != &aCplx){ mNum.Im = aCplx.getIm(); mNum.Re = aCplx.getRe(); } return *this; … Read More

  • [QUOTE=Sci@phy;710314]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...[/QUOTE] I have done something very similar to that previously so I am pretty sure thats not the problem. … Read More

  • 1
    Narue 5,707   9 Years Ago

    [code=cplusplus] template<typename T> LinkedQueue& LinkedQueue::operator=(const LinkedQueue& queue) { ll = queue.ll; return *this; } [/code] You need to be more careful about specifying template parameters: [code=cplusplus] template<typename T> LinkedQueue<T>& LinkedQueue<T>::operator=(const LinkedQueue<T>& queue) { ll = queue.ll; return *this; } [/code] Read More

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;
}
Votes + Comments
thanks for trying to help
0

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.

0

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;

0

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.

0

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...

1

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.

0

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.

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;
}
Votes + Comments
thanks
0

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

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.