Почему я получаю ошибку компоновщика, когда все в одном файле? - PullRequest
0 голосов
/ 09 июля 2019

Я получаю ошибку LNK 2019 в VS.

Я прочитал несколько похожих проблем, но не смог понять, что мне делать. Насколько я понял, VS не может найти код класса шаблона по какой-то причине. Я не уверен.

#include "pch.h"
#include <iostream>
#include <assert.h>

template<typename T>
struct item {
    item* pointer = nullptr;
    T value;
};
template <typename T>
class stack {
private:
    item<T>* top;
public:
    stack() { top = nullptr; };
    ~stack();
    void push(const T& s) {
        item<T>* p = top;
        top = new item<T>;
        assert(top != nullptr);
        top->value = s;
        top->pointer = p;
        std::cout << "The item has been pushed." << std::endl;
    }
    void pop() {
        T s;
        if (!top) {
            std::cout << "The stack is empty." << std::endl;
        }
        else {
            s = top->value;
            item<T>* p = top;
            top = top->pointer;
            delete p;
            std::cout << "The item has been  popped." << std::endl;
        }
    };
    void check() {
        if (!top) { std::cout << "The stack is empty." << std::endl; }
        else { std::cout << "It has elements in it." << std::endl; }
    }
};
int main()
{
    stack<int> test;
    return 0;
}

Я хочу, чтобы потом можно было выдвигать и вставлять элементы. Так что я могу продолжить свой проект.

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Вы объявили деструктор для stack здесь:

~stack();

но вы не определяете это. Измените вышеуказанное на

~stack() { /* Clean up resources here. */ }

и должно работать.

1 голос
/ 09 июля 2019

В C ++, если вы объявляете деструктор, вы должны определить его.Даже если деструктор является чисто виртуальным, вам все равно придется его определить, иначе вы получите ошибку компоновщика, как здесь.Если вам подходит деструктор по умолчанию, но вы все равно хотите объявить его по какой-то причине, например, чтобы сделать его виртуальным, вы можете использовать ключевое слово default:

virtual ~stack() = default;

. Вы можете узнать больше оdefault ключевое слово здесь .

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