-
help please
i am getting the following error in my code. I am trying to convert a queue class to a template. the compiler doesn't like my operator overloading. I get the following error:
queue.h(20) : error C2679: binary '<<' : no operator defined which
takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
queue.h(16) : while compiling class-template member function
'class ostream &__cdecl Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::operator <<(class ostream &,class Queue<class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> > >)'
Error executing cl.exe.
main.obj - 1 error(s), 1 warning(s)
here's my code:
//main.cpp
#include "queue.h"
#include <string>
using std::string;
int main() {
Queue <int> q;
q.enqueue(123);
q.enqueue(42);
cout << q;
q.dequeue();
cout << q;
Queue <string> s;
s.enqueue("student1");
s.enqueue("student2");
cout << s;
s.dequeue();
cout << s;
return 0;
}
--------------------------------
//queue.h
#ifndef _QUEUE_H
#define _QUEUE_H
#include <iostream.h>
using std::cout;
using std::endl;
template <class T>
class Queue {
friend ostream& operator<<(ostream& out, class <T> q) {
out << "Front" << endl;
for (int i = q.myFront; i != q.myNextFreePosition; q.incr(i)) {
out << q.myData[i] <<"," ;
}
out << "END" << endl;
return out;
}
public:
T dequeue() {
T retval = myData [myFront];
return retval;
} //removes element from front
void enqueue(T item){
myData[myNextFreePosition] = item;
incr (myNextFreePosition);
} // adds element to back
bool empty() {
return (myNextFreePosition == myFront);
}
T front (){
return myData[myFront];
} //returns element from front
Queue(){
myNextFreePosition = 0;
myFront = 0;
} //constructor
private:
void incr (int &pos) {
pos = (pos + 1) % 1300;
}//increment index of array
T myData[1300]; // array of data
int myNextFreePosition; // next free position
int myFront; //front of queue
};
#endif
my program does not like the <string> class in main.cpp. if i replace <string> with <char*> the program works. however my lab assignment is to use <string>. Any ideas on why i am getting this error. been looking at this program too long now to see what's wrong. sure it's obvious to everyone but me. thanks.
-
>I get the following error:
Old C++ didn't support namespaces, so when you use iostream.h you can't declare any using statements for iostream objects. To solve your current problem, change this in your queue.h file:
#include <iostream.h>
using std::cout;
using std::endl;
to this:
#include <iostream>
using std::cout;
using std::endl;
That will fix those first two errors, but you have quite a few other problems with your code. I'll leave debugging that to you unless you get really stuck.
-Prelude
-
Try reversing the order of your includes and make sure the using std statement is also ahead of the other include.
-
prelude & golfinguy4 - thanks for the tips.
prelude - i made the changes you suggested on now i get 28 errors. here's what i get:
queue.h(23) : error C2143: syntax error : missing ';' before '&'
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2433: 'ostream' : 'friend' not permitted on data declarations
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2501: 'ostream' : missing storage-class or type specifiers
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2244: 'ostream' : unable to resolve function overload
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2061: syntax error : identifier 'ostream'
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2501: '<<' : missing storage-class or type specifiers
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2805: binary 'operator <<' has too few parameters
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2333: '<<' : error in function declaration; skipping function body
queue.h(64) : see reference to class template instantiation 'Queue<T>' being compiled
queue.h(23) : error C2143: syntax error : missing ';' before '&'
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2433: 'ostream' : 'friend' not permitted on data declarations
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2501: 'ostream' : missing storage-class or type specifiers
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2244: 'ostream' : unable to resolve function overload
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2061: syntax error : identifier 'ostream'
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2501: '<<' : missing storage-class or type specifiers
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2805: binary 'operator <<' has too few parameters
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2333: '<<' : error in function declaration; skipping function body
main.cpp(13) : see reference to class template instantiation 'Queue<int>' being compiled
queue.h(23) : error C2143: syntax error : missing ';' before '&'
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2433: 'ostream' : 'friend' not permitted on data declarations
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2501: 'ostream' : missing storage-class or type specifiers
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2244: 'ostream' : unable to resolve function overload
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2061: syntax error : identifier 'ostream'
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2501: '<<' : missing storage-class or type specifiers
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2805: binary 'operator <<' has too few parameters
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
queue.h(23) : error C2333: '<<' : error in function declaration; skipping function body
main.cpp(14) : see reference to class template instantiation 'Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' being compiled
main.cpp(17) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Queue<int>' (or there is no acceptable conversion)
main.cpp(19) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Queue<int>' (or there is no acceptable conversion)
main.cpp(24) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' (or there
is no acceptable conversion)
main.cpp(26) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Queue<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >' (or there
is no acceptable conversion)
Error executing cl.exe.
main.obj - 28 error(s), 0 warning(s)
i know you said there were other problems with my code, but i cannot figure out what they are. i made a few changes, but i seem to be getting nowhere. here are the changes i made - not very many:
//queue2.h
#ifndef _QUEUE_H
#define _QUEUE_H
#include <iostream>
using std::cout;
using std::endl;
template <class T>
class Queue {
friend ostream& operator<<(ostream& out, Queue q) {
out << "Front" << endl;
for (int i = q.myFront; i != q.myNextFreePosition; q.incr(i)) {
out << q.myData[i] <<"," ;
}
out << "END" << endl;
return out;
}
public:
T dequeue() {
T retval = myData [myFront];
return retval;
} //removes element from front
void enqueue(T item){
myData[myNextFreePosition] = item;
incr (myNextFreePosition);
} // adds element to back
bool empty() {
return (myNextFreePosition == myFront);
}
T front (){
return myData[myFront];
} //returns element from front
Queue(){
myNextFreePosition = 0;
myFront = 0;
} //constructor
private:
void incr (int &pos) {
pos = (pos + 1) % 1300;
}//increment index of array
T myData[1300]; // array of data
int myNextFreePosition; // next free position
int myFront; //front of queue
};
#endif
-----------------
//main.cpp
#include "queue.h"
#include <string>
using std::string;
int main() {
Queue <int> q;
Queue <string> s;
q.enqueue(123);
q.enqueue(42);
cout << q;
q.dequeue();
cout << q;
//Queue <string> s;
s.enqueue("student1");
s.enqueue("student2");
cout << s;
s.dequeue();
cout << s;
return 0;
}
believe it or not the following code i've posted compiles on the linux workstation i telnet to. however the errors i am getting are from trying to run this in visual c++ ver 6. if you could give me a hint on what is wrong with my code it would be greatly appreciated. i know it's something very simple but i am starting to go nuts looking at this code. any help would be greatly appreciated. thanks in advance.
-
Replace your queue.h with this. It compiles and links but i didn't check to see if the logic is sound.
Code:
#ifndef _QUEUE_H
#define _QUEUE_H
#include <iostream>
using std::cout;
using std::endl;
template <class T>
class Queue {
friend std::ostream& operator<< ( std::ostream& out, Queue q ) {
out << "Front" << endl;
for (int i = q.myFront; i != q.myNextFreePosition; q.incr(i)) {
out << q.myData[i] <<"," ;
}
out << "END" << endl;
return out;
}
public:
T dequeue() {
T retval = myData [myFront];
return retval;
} //removes element from front
void enqueue(T item){
myData[myNextFreePosition] = item;
incr (myNextFreePosition);
} // adds element to back
bool empty() {
return (myNextFreePosition == myFront);
}
T front (){
return myData[myFront];
} //returns element from front
Queue(){
myNextFreePosition = 0;
myFront = 0;
} //constructor
private:
void incr (int &pos) {
pos = (pos + 1) % 1300;
}//increment index of array
T myData[1300]; // array of data
int myNextFreePosition; // next free position
int myFront; //front of queue
};
#endif
-Prelude
-
Prelude-I changed my code to your suggestions and it works perfectly. THANK YOU!