--------------------- Queue.h --------------------
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
#include "MyException.h"
using namespace std;
template<class T>
class Queue;
template<class T>
ostream& operator<<(ostream&,Queue<T>&);
template<class T>
class Queue
{
public:
friend ostream& operator<< <T>(ostream&,Queue<T>&);
Queue();
Queue(const Queue<T>& other);
Queue<T>& operator=(const Queue<T>& other);
~Queue();
void enqueue(const T& el);
T dequeue();
void increasePriority(const T& el);
bool isEmpty();
private:
class Node
{
public:
Node(const T& data, Node* n = 0)
{
element = data;
next = n;
}
T element;
Node* next;
};
Node* head;
};
#include "Queue.C"
#endif
我们根本不允许更改.h(上面)文件。
--------------------- Queue.C --------------------
#include "Queue.h"
template<class T>
ostream& operator << (ostream &strm, Queue<T> &obj)
{
if (obj.isEmpty())
{
strm << "[]";
return strm;
}
else
{
strm << '[';
//line 28
Node* tmp = new Node();
tmp = obj.head;
strm << tmp.element + ',';
while (tmp->next != 0)
{
tmp = tmp->next;
if (tmp-next != 0)
{
strm << tmp.element + ',';
}
else
{
strm << tmp.element;
}
}
strm << ']';
delete [] tmp;
tmp = 0;
return strm;
}
return strm;
}
//...more code
Queue::Queue()
{
//line 54
head = new Node();
}
因此,从该代码中我收到的一些错误如下:
Queue.C: In function ‘std::ostream& operator<<(std::ostream&, Queue<T>&)’:
Queue.C:28: error: ‘Node’ was not declared in this scope
Queue.C:28: error: ‘tmp’ was not declared in this scope
Queue.C:28: error: expected type-specifier before ‘Node’
Queue.C:28: error: expected ‘;’ before ‘Node’
Queue.C:34: error: ‘next’ was not declared in this scope
Queue.C: At global scope:
Queue.C:54: error: ‘head’ was not declared in this scope
Queue.C:54: error: expected type-specifier before ‘Node’
Queue.C:54: error: expected ‘;’ before ‘Node’
答案 0 :(得分:1)
您在Queue.h
中加入Queue.C
,反之亦然。您不应在Queue.h
中加入Queue.C
,因为您希望可以从标题中访问整个实现。
接下来,Node
在Queue
内声明,因此在实现中它必须以Queue
类模板的范围为前缀:
Queue<T>::Node ...; // instead of Node
答案 1 :(得分:1)
您必须在Node
前加上其定义的范围,即Queue
Queue<T>::Node* tmp = new Queue<T>::Node();
否则编译器不知道您的Node
类型。
但是在下一行中,您使用tmp
覆盖obj.head
指针并丢失新创建的Node
。这将导致内存泄漏。在任何情况下,您都不需要在运算符中创建新的Node
,它只输出一个队列。
再往下,你
delete [] tmp;
删除队列中的最后一个元素。我想,你不应该在这个输出操作符中以任何方式修改Queue。
这导致下一点,应该声明此运算符
friend ostream& operator<< <T>(ostream&, const Queue<T>&);
以避免意外修改Queue对象。