编码队列模板类

时间:2016-03-16 00:50:44

标签: c++

使用我的数据结构类的模板创建队列类。我正在构建一个C2955“队列 - 使用类模板需要模板参数列表”,在我认为从这一个产生的一堆其他错误中。我已经将这个程序与其他使用模板的程序进行了比较,我似乎无法弄清楚这有什么不同。谁能帮助我度过难关?

//Queue.cpp
#include <iostream>
#include "Queue.h"

using namespace std;

//Default constructor for Queue object
template<class ItemType>
Queue<ItemType>::Queue() {
    front = 0;
    back = 0;
    count = 0;
}

//Check if the queue is empty
template<class ItemType>
bool Queue<ItemType>::empty() const {

    if (count == 0) {
        return true;
    }
    else {
        return false;
    }
}

//Remove the first item in the queue
template<class ItemType>
bool Queue<ItemType>::dequeue() {

    int p = count;

    for (int i = 0; i < count - 1; i++) {
        items[i] = items[i + 1];
    }

    count--;

    if (p > count) {
        return true;
    } else {
        return false
    }

}

//Add an entry to the beginning of the queue
template<class ItemType>
bool Queue<ItemType>::enqueue(const itemType &item) { 

    count++;
    items[count - 1] = item;

    return true;
}

template<class ItemType>
bool Queue<ItemType>::peekFront(itemType &item) const {
    item = items[0];
    return true;
}

template<class ItemType>
int Queue<ItemType>::getSize() const {
    return count;
}  

我可以找到Queue.cpp中没有明显的语法错误。我知道后面和前面没有使用,但我不确定他们的意思是什么。我们的教授为我们提供了大部分头文件和主文件。

//Queue.h
#ifndef _QUEUE
#define _QUEUE
#include<iostream>
#include<vector>
using namespace std;
const int MAX_SIZE=10;
typedef int itemType;

template <class ItemType>
class Queue {
public:
    Queue();  // Constructor. Initialize front=0, back=0, count=0 
    bool empty() const; // To test if the queue is empty. Return true if it          is, flase if it is not. 
    bool dequeue(); // Remove the front entry from the queue
    bool enqueue(const itemType &item); // Add new entry called item at the     back of the queue. 
    bool peekFront(itemType &item) const; // Retrieve the front entry from the queue
    int getSize() const ;  // To get the number of the entries in the queue


    vector<itemType> toVector() const  // to convert the queue to a vector
    {
        vector<itemType> vectorQ;

        int i=front;
        int size=count;
        while (size>0)
        {
            i=i%MAX_SIZE;
            vectorQ.push_back(items[i]);
            i++;
            size--;
        }
        return vectorQ;

    }

private:
    int front, back; 
    int count;
    itemType items[MAX_SIZE];  // items is a circular array to store the queue.

};

#endif

总的来说,当“队列q;”被调用来创建一个空队列对象,有一条红线说“类模板的参数列表”队列“缺失

#include "Queue.h"
#include "Queue.cpp"

using namespace std;

void displayQ(Queue & queue)
{
    cout << "The queue contains :\n" ;
    vector<int> queueItems=queue.toVector();
    for (int i=0; i<queue.getSize(); i++)
    {
        cout <<queueItems[i] << " ";
    }
    cout << endl;
}    

int main()
{
    Queue q;  //create an empty queue

    bool flag=q.empty(); // To test if the queue is really empty.
    if (flag)  
        cout <<"The queue is empty.\n";

    q.enqueue(1);  //To test the enqueue function by inserting a set of numbers (1-10) into q. 
    q.enqueue(2);
    q.enqueue(3);
    q.enqueue(4);
    q.enqueue(5);
    q.enqueue(6);
    q.enqueue(7);
    q.enqueue(8);
    q.enqueue(9);
    q.enqueue(10);
    displayQ(q);  // Display the contents in q.

    int buffer;   // To test the peekFront function. The buffer should hold the the value of the front entry  
    q.peekFront(buffer);
    cout << "The front entry of the queue is " << buffer << " .\n";

    flag=q.enqueue(11); // To test the returned value of the enqueue fnction. It returns flase when the q has no room 
    if (!flag)
        cout << "The queue is full. No room for insertion.\n";

    q.dequeue(); // To test the dequeue function. Remove the first two entries from the q.
    q.dequeue();
    displayQ(q);  // Display the contents in q.

    q.enqueue(11);  // Does the q have room to hold two more new entry?
    q.enqueue(12);
    displayQ(q);  // Display the contents in q.

    q.peekFront(buffer); // what's the front entry of the q now?  
    cout << "The front entry of the queue is " << buffer << " .\n";

}

构建时遇到的其他错误是C2662和C2244

1 个答案:

答案 0 :(得分:0)

正如错误消息所示,您必须添加模板参与列表才能使用Queue

更改

void displayQ(Queue & queue)

template<class itemType>
void displayQ(Queue<itemType> & queue)

然后,改变

Queue q;  //create an empty queue

main()

Queue<int> q;  //create an empty queue

最后,改变

return false

bool Queue<ItemType>::dequeue()

return false;

(添加分号)

此外,您应该删除#include "Queue.cpp"并将Queue.cpp中的成员函数的实现移至Queue.h,因为包含.cpp通常被视为错误,因为它可能会导致链接器错误对于重复定义,如果temlate函数位于不同的翻译单元中,则不能使用它们。

还有一点:评论说

flag=q.enqueue(11); // To test the returned value of the enqueue fnction. It returns flase when the q has no room

但实际实施

//Add an entry to the beginning of the queue
template<class ItemType>
bool Queue<ItemType>::enqueue(const itemType &item) { 

    count++;
    items[count - 1] = item;

    return true;
}

不会执行评论中所说的内容并导致超出范围的访问权限。 你应该做以下其中一个:

  • MAX_SIZE包含在足够大的值中。
  • 实施错误检查。