当所有内容都在一个文件中时,为什么会出现链接器错误?

时间:2019-07-09 06:31:59

标签: c++ templates

我在VS中收到LNK 2019错误。

我已经阅读了两个类似的问题,但是无法理解我应该怎么做。据我所知,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 个答案:

答案 0 :(得分:3)

您在此处声明了stack的析构函数:

~stack();

但是您没有定义它。将以上内容更改为

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

它应该可以工作。

答案 1 :(得分:1)

在C ++中,如果声明了析构函数,则必须对其进行定义。即使析构函数是纯虚拟的,也仍然必须对其进行定义,否则将出现链接器错误,如此处的情况。如果您对默认的析构函数没问题,但是出于某种原因仍想对其进行声明(例如,使其虚拟化),则可以使用关键字default

virtual ~stack() = default;

您可以详细了解default关键字here