2013-02-25 150 views
1

--------------------- Queue.h ------------ --------C++:[class]未在此范围内声明

#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(above)文件。

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

'Node'是'Queue'的一部分。 – chris 2013-02-25 06:49:51

+0

由于源文件包含在头文件中,因此不需要将头文件包含在源文件中。 – 2013-02-25 06:52:17

回答

1

要包括在Queue.CQueue.h,反之亦然。您不应该在Queue.C中包含Queue.h,因为您希望可以通过标题访问整个实施。

接下来,Node声明中Queue,所以在执行它与Queue类模板的范围前缀:

Queue<T>::Node ...; // instead of Node 
1

您必须前缀Node它是在限定的范围,即Queue

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

,否则编译器不知道你是哪个Node型。

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

再往下,你

delete [] tmp; 

其删除队列中的最后一个元素。我想,你不应该在这个输出操作符中以任何方式修改Queue。

这会导致下一个点,该运营商应声明

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

,以避免意外修改Queue对象。