使用我的数据结构类的模板创建队列类。我正在构建一个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
答案 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
包含在足够大的值中。