我正在C ++中创建带有模板的动态Que,以供进一步练习。除了我定义的最后2个功能外,最重要的功能似乎都可以正常工作-没有参数的void函数。
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class DynamicQueue
{
private:
// Structure for the queue nodes
struct QueueNode
{
T value; // Value in a node
QueueNode *next; // Pointer to the next node
};
QueueNode *top; // The top of the queue
QueueNode *bottom; // The bottom of the queue
int numItems; // Number of items in the queue
public:
DynamicQueue() {
top = nullptr;
bottom = nullptr;
numItems = 0;
}
~DynamicQueue() {
delete[] top;
delete[] bottom;
}
template <typename T>
bool isEmpty() const {
bool empty;
if (numItems > 0)
empty = false;
else
empty = true;
}
template <typename T>
void display() const {
QueueNode* temp = top;
while (temp != nullptr) {
cout << temp->value << endl;
temp=temp->next;
}
}
template <typename T>
void clear() {
T temp;
while (!isEmpty()) {
dequeue(data);
}
}
};
我没有在代码中包含enque和deque函数,因为它们工作得很好。 主要功能看起来像:
int main() {
string str;
int number;
DynamicQueue<string> strQ;
DynamicQueue<int> intQ;
strQ.enqueue("Word number 1");
strQ.enqueue("2");
strQ.dequeue("2");
strQ.display();
intQ.enqueue(1);
intQ.enqueue(2);
int placehold;
intQ.dequeue(placehold);
intQ.display();
strQ.clear();
intQ.clear();
getchar();
return 0;
}
编译器会产生以下错误:
错误C2672:“ DynamicQueue :: display”:找不到匹配的重载函数
错误C2783:“无效DynamicQueue :: display(void)const”:无法推断出“ T”的模板参数
注意:请参见“ DynamicQueue :: display”的声明
我知道问题出在我做模板错误的地方。但是我似乎不了解正确的方法。
(clear()函数存在相同的问题)
答案 0 :(得分:0)
您似乎遇到了模板屏蔽问题,因为您是在类方法定义上重新声明模板 T ,这在您的情况下是多余的。
如果您在类定义之外实现了方法,则很有必要。
内部类定义:
void clear() {
// Stuff
}
外部:
template <typename T>
void DynamicQueue<T>::clear() {
// Stuff
}
您最初使用的语法是特定于方法的新模板声明,例如,将其入队可能是:
template<typename... Args>
void enqueue(Args&&... args)
{
// Create new node
QueueNode* new_node = new QueueNode();
bottom->next = new_node;
new (&(new_node->value)) T(args...);
bottom = new_node;
}
以及外部声明:
template<typename T>
template<typename... Args>
void DynamicQueue<T>::enqueue(Args&&... args)
{
// Create new node
QueueNode* new_node = new QueueNode();
bottom->next = new_node;
new (&(new_node->value)) T(args...);
bottom = new_node;
}
,但是模板参数的名称不能为 T ,否则会出现阴影问题