我在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;
}
之后我希望能够推送和弹出元素。这样我就可以继续进行我的项目了。
答案 0 :(得分:3)
您在此处声明了stack
的析构函数:
~stack();
但是您没有定义它。将以上内容更改为
~stack() { /* Clean up resources here. */ }
它应该可以工作。
答案 1 :(得分:1)
在C ++中,如果声明了析构函数,则必须对其进行定义。即使析构函数是纯虚拟的,也仍然必须对其进行定义,否则将出现链接器错误,如此处的情况。如果您对默认的析构函数没问题,但是出于某种原因仍想对其进行声明(例如,使其虚拟化),则可以使用关键字default
:
virtual ~stack() = default;
您可以详细了解default
关键字here。