C ++:[class]未在此范围内声明

时间:2013-02-25 06:47:57

标签: c++ templates overloading operator-keyword

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

2 个答案:

答案 0 :(得分:1)

您在Queue.h中加入Queue.C,反之亦然。您不应在Queue.h中加入Queue.C,因为您希望可以从标题中访问整个实现。

接下来,NodeQueue内声明,因此在实现中它必须以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对象。