编译失败,"using" "expected unqualified-id"

Compilation fails with "expected unqualified-id" on "using"

本文关键字:expected unqualified-id using 编译 失败      更新时间:2023-10-16

我需要一些帮助为课堂制作这个程序。我们正在使用g++ (linux?它通过腻子在服务器上)我有很多问题与这个链表。它给我的当前错误是

queue.cpp:2: error: expected unqualified-id before using

想知道是否有人能帮我弄清楚。一点点搜索显示,问题似乎是在#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);
}
  1. 不要在头文件中包含你的实现文件。包括实现文件中的头文件。
  2. 我没有看到你在代码的标题中说"使用命名空间std",但你在评论中说你这样做了。不喜欢。不要在头文件中说using namespace
  3. 将所有模板定义放在头文件中。
  4. 在头文件的类定义中缺少一个分号。
  5. 你的赋值操作符不是异常安全的。确保你的复制构造函数是正确的,然后使用copy &交换成语。
  6. 你的复制构造函数不正确。如果您想支持延迟复制(写时复制),那么这很好,但是您错过了实际的深度复制操作。使用复制构造函数时要格外小心,因为正确使用它非常重要。

头文件中的类声明后面需要一个分号。

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