0

---------------------队列.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(上图)文件。

---------------------队列.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’
4

2 回答 2

1

您包括Queue.hin Queue.C,反之亦然。您不应该包含Queue.hin Queue.C,因为您希望整个实现都可以从标题中访问。

接下来,Node在里面声明Queue,所以在实现中它必须以Queue类模板的范围为前缀:

Queue<T>::Node ...; // instead of Node
于 2013-02-25T06:52:33.460 回答
1

您必须为其定义的范围添加前缀Node,即Queue

Queue<T>::Node* tmp = new Queue<T>::Node();

否则编译器不知道Node你的意思是哪种类型。

但是在下一行中,您用tmp指针覆盖obj.head并丢失了新创建的Node. 这将导致内存泄漏。在任何情况下,您都不需要Node在仅输出队列的运算符中创建 new s。

再往下,你

delete [] tmp;

这会删除队列中的最后一个元素。我想,您不应该在此输出运算符中以任何方式修改队列。

这导致了下一点,应该声明这个运算符

friend ostream& operator<< <T>(ostream&, const Queue<T>&);

避免意外修改 Queue 对象。

于 2013-02-25T06:57:49.570 回答