C ++ |无法推断T |的模板参数没有参数的Void函数(display())

问题描述 投票:2回答:1

我正在用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);
    }
}
};

有一个enqueue和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:'void DynamicQueue :: display(void)const':无法推断'T'的模板参数

注意:请参阅'DynamicQueue :: display'的声明

我知道问题出在我的模板错误中。但我似乎不明白这样做的正确方法。

(clear()函数有同样的问题)

c++ compiler-errors
1个回答
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或者你会有阴影问题

© www.soinside.com 2019 - 2024. All rights reserved.