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

时间:2019-03-20 04:55:51

标签: c++ compiler-errors

我正在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()函数存在相同的问题)

1 个答案:

答案 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 ,否则会出现阴影问题