Шаблон на C ++

0

Я пытаюсь реализовать односвязный список, в котором хранятся несколько типов элементов. Поэтому я столкнулся с шаблонами, но когда я попытался запустить следующий код, компилятор дал мне несколько ошибок связывания (LNK 2019: неразрешенный внешний символ). Я еще ничего не сделал и не могу понять, что пошло не так. Может ли кто-нибудь указать мою ошибку?

singlylinkedlist.h

template <class Item>
class SinglyLinkedList
{
public:
    SinglyLinkedList();
    ~SinglyLinkedList();

private:
    template <class I>
    struct Node {
        I item;
        Node<I> *next;
    };
    Node<Item> *head; 
};

singlylinkedlist.cpp

#include "singlylinkedlist.h"

template <class Item>
SinglyLinkedList<Item>::SinglyLinkedList()
{
    head = NULL;
}

main.cpp

#include <iostream>
#include "singlylinkedlist.h"

using namespace std;

int main()
{
    SinglyLinkedList<string> list;
}
  • 0
    Вам не нужен дополнительный параметр шаблона для структуры Node , достаточно просто использовать параметр Item из внешнего класса.
  • 0
    Спасибо за ваш ответ πάντα ῥεῖ и мат. На самом деле я обнаружил, что моя проблема была в том, что мне нужно было объявить список SinglyLinkedList <string> * как указатель в main (). Я не совсем уверен, почему, хотя ..
Показать ещё 4 комментария
Теги:
templates

2 ответа

1
Лучший ответ

Есть ряд небольших проблем с кодом, например, вы не реализовали деструктор, и вам не нужно очень часто менять шаблон Node. Измените свою реализацию следующим образом:

// singlylinkedlist.h
template <class Item>
class SinglyLinkedList
{
public:
    SinglyLinkedList() : head(NULL) {}
    ~SinglyLinkedList() {}

private:
    struct Node {
        Item item;
        Node *next;
    };
    Node *head; 
};

// main.cpp
#include "singlylinkedlist.h"
using namespace std;

int main()
{
    SinglyLinkedList<string> list;
}
  • 0
    Я обнаружил, что моя проблема была с указателями, в которых мне нужно объявить список как указатель в main (). Спасибо за ответ на мой вопрос.
  • 0
    @QQO Это не решит твою проблему !! Попробуйте инициализировать этот указатель, и вы снова получите те же ошибки компиляции.
Показать ещё 4 комментария
0

Вы не реализовали деструктор:

template <class Item>
SinglyLinkedList<Item>::~SinglyLinkedList()
{
    //cleanup
}
  • 0
    Объявление списка в качестве указателя в main () решает мою проблему. Спасибо за Ваш ответ.
  • 2
    @QQO Нет, это не ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню