重载运算符<<在队列类模板中
Overloading operator<< within queue class template
其他所有重载操作符都正常工作。然而,我在获取<<
编译器说:
Queue.h: In function ' std::ostream&operator<& lt; (const Queue&std:: ostream&;)":
Queue.h:203:19: error: ' currNode '未在此作用域中声明
下面是我的代码:Queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include <string>
#include <iostream>
using namespace std;
template <typename T>
class Queue
{
template <typename V>
friend ostream& operator<<(ostream&, const Queue<V>&);
class Node
{
friend class Queue;
public:
T* data;
Node* next;
};
public:
Queue();
Queue(Queue<T>&);
~Queue();
void pushBack(T*);
void popFront();
T front();
bool empty();
T* operator[](int);
Queue<T>& operator+=(T*);
Queue<T>& operator+=(Queue<T>&);
Queue<T> operator+(T*);
Queue<T> operator+(Queue<T>&);
Queue<T>& operator-=(T*);
Queue<T>& operator-=(Queue<T>&);
Queue<T> operator-(T*);
Queue<T> operator-(Queue<T>&);
Queue<T>& operator=(const Queue<T>&);
//Empty the queue
Queue<T> operator!();
private:
Node* head;
};
//Constructor
template <typename T>
Queue<T>::Queue(): head(0)
{
}
template <typename T>
Queue<T>::Queue(Queue<T>& copy)
{
head=0;
Node* currNode = copy.head;
Node* prevNode = 0;
Node* newNode;
while (currNode!=0){
newNode = new Node();
newNode->data = currNode->data;
if (prevNode!=0) prevNode->next = newNode;
if (head ==0) head = newNode;
prevNode=newNode;
currNode=currNode->next;
}
}
//Destructor
template <typename T>
Queue<T>::~Queue()
{
Node *currNode, *nextNode;
currNode = head;
while(currNode!=0){
nextNode=currNode->next;
delete currNode;
currNode=nextNode;
}
}
//Adding to back
template <typename T>
void Queue<T>::pushBack(T *newData){
Node *newNode = new Node;
newNode->data = newData;
newNode->next = 0;
//If empty
if (head==0){
head = newNode;
return;
}
Node *currNode;
currNode = head;
while(currNode->next!=0)
currNode=currNode->next;
currNode->next = newNode;
}
//Removing from front
template <typename T>
void Queue<T>::popFront(){
Node *oldNode;
oldNode = head;
head = oldNode->next;
delete oldNode;
}
//getFront
template <typename T>
T Queue<T>::front(){
return *(head->data);
}
//Is it empty
template <typename T>
bool Queue<T>::empty(){
if (head==0)
return true;
else
return false;
}
/*------------------------Overloaded Operators---------------------------*/
template <typename T>
Queue<T>& Queue<T>::operator+=(Queue<T>& q)
{
Node *curr;
curr = q.head;
while(curr!=0)
{
this->pushBack(curr->data);
curr = curr->next;
}
return (*this);
}
template <typename T>
Queue<T> Queue<T>::operator+(Queue<T>& q)
{
Queue<T> newQueue = *this;
newQueue+=q;
return newQueue;
}
template <typename T>
Queue<T> Queue<T>::operator+(T *t)
{
Queue<T> tmp = *this;
if(t == 0)
return tmp;
tmp.pushBack(t);
return tmp;
}
template <typename T>
Queue<T>& Queue<T>::operator+=(T *t)
{
if(t == 0)
return (*this);
this->pushBack(t);
return (*this);
}
template <typename T>
Queue<T> Queue<T>::operator!()
{
if(this ==0)
return (*this);
Node *curr = head;
while(curr!=0)
{
curr = curr->next;
this->popFront();
}
return (*this);
}
/*NOT WORKING?!?!*/
template <typename T>
ostream& operator<<(ostream& output, const Queue<T>& q)
{
Queue<T>::Node *currNode; /******HERE IS THE PROBLEM******/
currNode = q.head;
if(q.head == 0)
{
output << "Empty" << endl;
return output;
}
do {
output << *(currNode->data) << endl;
currNode = currNode->next;
} while (currNode != 0);
return output;
}
template <typename T>
Queue<T>& Queue<T>::operator-=(T *t)
{
if(t == 0)
return (*this);
//REMOVE ELEMENT
Node *currNode, *prevNode;
currNode=head;
prevNode=0;
while (currNode != 0){
if ((*currNode->data) == (*t)){
if (prevNode == 0)
head = currNode->next;
else
prevNode->next = currNode->next;
delete currNode;
break;
}
prevNode=currNode;
currNode=currNode->next;
}
return (*this);
}
template <typename T>
Queue<T>& Queue<T>::operator-=(Queue<T>& q)
{
//REMOVE ELEMENT
Node *currNode;
currNode=q.head;
while(currNode!=0)
{
(*this)-=currNode->data;
currNode=currNode->next;
}
return (*this);
}
template <typename T>
Queue<T> Queue<T>::operator-(T *t)
{
//REMOVE ELEMENT
Queue<T> newQueue = *(this);
newQueue-=t;
return newQueue;
}
template <typename T>
Queue<T> Queue<T>::operator-(Queue<T>& q)
{
//REMOVE ELEMENT
Queue<T> newQueue= *(this);
newQueue-=q;
return newQueue;
}
template <typename T>
Queue<T>& Queue<T>::operator=(const Queue<T>& copy)
{
head=0;
Node* currNode = copy.head;
Node* prevNode = 0;
Node* newNode;
while (currNode!=0){
newNode = new Node();
newNode->data = currNode->data;
if (prevNode!=0) prevNode->next = newNode;
if (head ==0) head = newNode;
prevNode=newNode;
currNode=currNode->next;
}
return (*this);
}
template <typename T>
T* Queue<T>::operator[](int index)
{
Node *currNode;
currNode=head;
int i=0;
while(currNode!=0){
if(index==i++)
return currNode->data;
currNode=currNode->next;
}
return 0;
}
#endif
main.cpp
#include <iostream>
#include <string>
#include "Queue.h"
using namespace std;
int main()
{
Queue<string> q1;
Queue<int> q2;
string s = "Hello";
int i = 3;
q1.pushBack(&s);
q2.pushBack(&i);
cout<<"contents of q1 = " << (*q1) << endl;
cout<<"contents of q2 = " << (*q2) << endl;
return 0;
}
谢谢你的帮助!
我强烈建议您阅读hmjd发布的链接,但问题的要点是您需要告诉编译器Queue::Node是一种类型,通过typename Queue< T >::Node
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多