2011-04-07 6 views
4

안녕하세요 여러분,이 프로그램을 만드는 데 도움이 필요합니다. 우리는 g ++ (리눅스에서 퍼티를 서버로 사용)와 함께 작업하고 있습니다.이 연결된 목록에 많은 문제가 있습니다. 현재 제공되는 오류는 입니다. queue.cpp : 2 : 오류 : âusing 전에 unqualified-id가 필요합니다. 누구든지 알아낼 수 있는지 궁금합니다. 약간의 검색 결과는 문제가 #define 어딘가에있는 것처럼 보인다고합니다. ?? 오류는 .cpp 파일에 있지만 .h 파일에 있다고 생각합니다. 또한 만약 당신이 나에게 잘못된 것으로 보이거나 더 좋은 방법이 있다면, 어떤 프로그래밍 조언을 해줄 수 있다면.g ++에 대한 unqualified-id 오류가 발생했습니다.

여기

#ifndef QUEUE_H 
#define QUEUE_H 

template <class Object> 
class Queue 
{ 
public: 
    Queue(); 
    Queue(const Queue& a_queue); 
    Queue& operator =(const Queue& rhs); 
    bool enqueue(const Object& d); 
    bool dequeue(const Object& d); 
    bool isEmpty() const; 
    ~Queue(); 

private: 
    struct ListNode 
    { 
     Object obj; 
     ListNode *next; 

    }; 
    ListNode *head; 
} 

#endif //Queue_H 
#include "queue.cpp" //include queue.cpp with file 

queue.cpp 파일 아래 queue.h 파일.

#include <iostream> 
using namespace std; 
template <class Object> 
Queue<Object>::Queue() 
{ 
    head = NULL; 
} 

template <class Object> 
Queue<Object>::Queue(const Queue<Object>& a_queue) 
{ 
    head=NULL; 
    *this=a_queue; 
} 

template <class Object> 
Queue<Object>& Queue<Object>::operator =(const Queue<Object> &rhs) 
{ 
    ListNode *nodePtr; 
    nodePtr = rhs.head; 
    if(this != rhs){ 
     this.head = NULL; 
     while(nodePtr != NULL){ 
      this.enqueue(nodePtr->obj); 
      nodePtr = nodePtr->next; 
     } 
    } 
} 

template <class Object> 
bool Queue<Object>::enqueue (const Object& d) //Enqueue 
{ 
    ListNode *newNode; 
    ListNode *nodePtr; 
    ListNode *previousNode; 
    previousNode = NULL; 
    nodePtr = NULL; 
    newNode = new ListNode; 
    newNode->obj = d; 
    newNode->next = NULL; 

    if(isEmpty){ 
     head = newNode; 
     return true; 
     } 
    else{ 
     nodePtr = head; 
     previousNode = NULL; 
     while(nodePtr != NULL){ 
      previousNode = nodePtr; 
      nodePtr=nodePtr->next; 
     } 
     if(previousNode->next == NULL){ 
      previousNode->next = newNode; 
      return true; 
     } 
     else 
      return false; 
    } 
} 

template <class Object> 
bool Queue<Object>::dequeue (const Object& d) //Dequeue 
{ 
    ListNode *nodePtr; 

    if(!head) 
     return false; 
    else{ 
     if(head->next != NULL){ 
      nodePtr = head; 
      d=nodePtr->obj; 
      head = head->next; 
      delete nodePtr; 
     }else 
      delete head; 
     return true; 
    } 
} 

template <class Object> 
bool Queue<Object>::isEmpty() const //Check if Empty 
{ 
    if(!head) 
     return true; 
    else 
     return false; 
} 

template <class Object> 
Queue<Object>::~Queue() //Destructor 
{ 
    Object temp; 
    while (head != NULL) 
     dequeue (temp); 
} 
+0

코드를 조금 더 살펴본 후에는 "using namespace std;"가 포함되어 있기 때문입니까? 내 .h와 .cpp 모두에서 ?? – kingcong3

답변

7
  1. 는 헤더에서 구현 파일을 포함하지 마십시오. 구현 파일의 헤더를 포함하십시오.
  2. 코드의 머리글에서 "using namespace std"라고 표시되지 않지만 사용자가 주석을 사용한다고 말하면됩니다. 하지마. 헤더 파일에 using namespace을 절대로 말하지 마십시오.
  3. 모든 템플릿 정의를 헤더에 배치하십시오.
  4. 헤더의 클래스 정의에 세미콜론이 없습니다.
  5. 귀하의 지정 연산자는 예외로부터 안전하지 않습니다. 귀하의 복사 생성자가 올바른지 확인한 다음 복사 & 스왑 이디엄을 사용하십시오.
  6. 복사 생성자가 잘못되었습니다. lazy copy (copy on write)를 지원하려면 괜찮습니다. 그러나 실제 deep copy 작업은 빠져 있습니다. 복사 생성자에주의를 기울여야합니다. 왜냐하면 복사 생성자를 올바르게 만드는 것이 중요하기 때문입니다.
+0

템플릿이기 때문에 구현을 포함해야하며 별도로 컴파일되지 않습니다. 대부분의 컴파일러에서. 그것은 그 중 하나 또는 헤더에 모든 것을 넣어. – jonsca

+0

그건 내가 말한거야. 머리글에 모든 것을 넣으십시오. 또는 정의를 템플릿 구현 파일 (.tcc 등)로 이동하십시오. 그러나 .cpp 확장은 템플릿 정의가 아닌 구현 파일 용입니다. – wilhelmtell

+0

죄송합니다. 귀하의 성명서 내용이 잘못 이해되었습니다. 나는 당신이 템플릿에 대해 알고 있다고 생각했기 때문에 내 의견을 쓰려고 망설였다. 롤. – jonsca

1

헤더에 클래스 선언 다음에 세미콜론이 필요합니다.

class Queue 
{ 
public: 
    Queue(); 
    Queue(const Queue& a_queue); 
    Queue& operator =(const Queue& rhs); 
    bool enqueue(const Object& d); 
    bool dequeue(const Object& d); 
    bool isEmpty() const; 
    ~Queue(); 

private: 
    struct ListNode 
    { 
     Object obj; 
     ListNode *next; 

    }; 
    ListNode *head; 
}; 
+0

아쉽지만 오류가 .cpp에 있다는 것을 계속해서 알려주지 만 실제로는 .h 고마워요 – kingcong3

+0

@ kingcon3 문제가 없습니다 – jonsca

관련 문제