g ++上预期的nonqualified-id错误

时间:2011-04-07 01:02:31

标签: c++ g++ linked-list

嘿伙计们我需要一些帮助才能上课。我们正在使用g ++(linux?它通过服务器上的putty)我对这个链表有很多问题。它给我的当前错误是 queue.cpp:2:错误:在使用之前预期的unqualified-id 想知道是否有人可以帮我搞清楚。一点点搜索表明问题似乎在#define某处?错误显示它在.cpp文件中,但我认为它在.h文件中。此外,如果你可以给我任何关于任何看似,错误或更好的方法的程序建议。

下面的queue.h文件

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

#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);
}

2 个答案:

答案 0 :(得分:7)

  1. 请勿在标头中包含您的实施文件。包括实现文件中的标题。
  2. 我没有看到你在代码的标题中说“使用命名空间std”,但是你在评论中说你这样做了。别。永远不要在标题文件中说using namespace
  3. 将所有模板定义放在标题中。
  4. 您在标题中的类定义中缺少分号。
  5. 您的赋值运算符不是异常安全的。确保你的拷贝构造函数是正确的,然后使用副本和&amp;交换习语。
  6. 您的副本构造函数不正确。如果你想支持延迟拷贝(写入时复制)那么这很好,但是你错过了实际的深拷贝操作。要非常小心复制构造函数,因为正确的做法非常重要。

答案 1 :(得分: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;
};