Ошибка C2955 при реализации связанного списка на основе класса struct / template - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь реализовать связанный список с помощью шаблонного класса и структуры для определения узлов. Я ожидал, что это скомпилируется, но не собирается. Ошибка, которую дает мне Visual Studio, это C2955 «использование шаблона класса требует списка аргументов шаблона», и при проверке документации Microsoft мой код, похоже, не соответствует ни одному из зарегистрированных случаев. Ошибка сообщается два раза в строке 15 файла LinkedList. cpp, где начинается метод add. Не смотрите на функцию pop, поскольку она не полностью реализована.

Исходный код LinkedList.h:

#pragma once

template <typename T>

struct TNode {
    T info;
    TNode* next;
    TNode* prev;
};

template <typename T>

class LinkedList {
private:
    TNode* head, * tail;
    int size = 0;
public:
    LinkedList();
    void add(T info);
    T pop();
    T peekTail();
    T peekHead();
    void print();
    void rprint();
    uint64_t length();
    bool empty();
    void debug();
};

LinkedList. cpp Исходный код:

#include <cstdlib>
#include <iostream>
#include "LinkedList.h"
using namespace std;

template <typename T>

LinkedList<T>::LinkedList() {
    head = NULL;
    tail = NULL;
}

template <typename T>

void LinkedList<T>::add(T info) {
    TNode* temp = new TNode;
    temp->info = info;
    temp->next = NULL;
    if (head == NULL) {
        head = temp;
        tail = temp;
    }
    else {
        tail->next = temp;
        temp->prev = tail;
        tail = tail->next;
    }
    size++;
}

template <typename T>

T LinkedList<T>::pop() {
    if (size != 0) {
        T info = tail->info;

        size--;
        return info;
    }
}

template <typename T>

T LinkedList<T>::peekTail() {
    return tail->info;
}

template <typename T>

T LinkedList<T>::peekHead() {
    return head->info;
}

template <typename T>

void LinkedList<T>::print() {
    cout << "Elements of the Linked List: ";
    TNode* temp = head;
    while (temp != NULL) {
        cout << temp->info << " ";
        temp = temp->next;
    }
}

template <typename T>

void LinkedList<T>::rprint() {
    cout << "Elements of the Linked List (Reverse): ";
    TNode* temp = tail;
    while (temp != NULL) {
        cout << temp->info << " ";
        temp = temp->prev;
    }
}

template <typename T>

uint64_t LinkedList<T>::length() {
    return size;
}

template <typename T>

bool LinkedList<T>::empty() {
    if (size == 0)
        return true;
    else
        return false;
}

template <typename T>

void LinkedList<T>::debug() {
    cout << length() << endl;
    print();
    cout << endl;
    rprint();
}

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 15 апреля 2020

У вас есть TNode* head, * tail;, но TNode является классом шаблона, поэтому вы должны указать ему тип. В вашем случае вы, вероятно, захотите TNode<T> *head, *tail;, чтобы узел содержал то же, что и связанный список. В любом месте вашего LinkedList, где вы используете TNode, также необходимо указать параметр шаблона.

Однако у вас будут другие проблемы. См. здесь почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...