昨天学习C++ 时候一直出现错误
仔细看分别报错
undefined reference to `stack::push
和
collect2.exe: error: ld returned 1 exit status
我的文件结构如下:
各文件如下 :
main.cpp:
#include "stack.hpp"
using namespace std;
void fill_stack(stack &stack, istream &is = cin)
{
string str;
while (is >> str && !stack.full())
{
stack.push(str);
}
cout << "read in " << stack.size() << "elements\n"<<endl;
}
int main(){
stack st;
string str;
cout << "s.size() = " << st.size()<<endl;
fill_stack(st);
cout << "s.size() = " << st.size()<<endl;
cout << "s.peek(str) = "<<st.peek(str)<<"["<<str<<"]"<<endl;
return 0;
}
stack.hpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class stack
{
private:
vector<string> _stack;
public:
bool push(const string &elem);
bool pop(string &elem);
bool peek(string &elem);
bool empty(){return _stack.empty();};
bool full() {return _stack.size() == _stack.max_size();};
int size(){
return _stack.size();
}
};
stack.cpp
#include "stack.hpp"
bool stack::pop(string &elem)
{
if (empty())
{
return false;
}
elem = _stack.back();
return true;
}
bool stack::push(const string &elem)
{
if (full())
{
return false;
}
_stack.push_back(elem);
return true;
}
bool stack::peek(string &elem)
{
if (empty())
{
return false;
}
elem = _stack.back();
return true;
}
先看第一个错误,类stack下的push函数未定义,类push方法在stack.cpp中实现,并且在main.cpp中引用了stack.hpp了为什么会说没定义呢?
1、首先检查函数名称以及参数列表是否正确
我这里函数以及参数名称全都正确没有问题,代码检查也没有提示报错
将这几段代码全都注释掉发现能正常运行,这下就奇怪了,同样是在main.cpp中使用stack类,在stack.hpp中的函数能正常使用,而在stack.cpp中定义的却无法使用。
仔细检查了相互间的应用头文件等都是正确的。main.cpp中却没法使用到stack.cpp中的部分
看第二个错误collect2.exe: error: ld returned 1 exit status有可能是编译错误。
再查了很久才发现原来是vscode的锅;
首先 :
调试模式的话需要设置 tasks.json中的 ${file} 改成 “${fileDirname}\\*.cpp”
改成:
但是右键运行时候依然报错
因为右键运行程序实际上是使用code runner,所以可能是code runner的锅
g++ 后同样的修改成为 *.cpp, 如果有c 语言的也可以在上面gcc 后改成 *.c
改完以后就能正常跑通了。
不得不说vscode对于新手的坑还是挺多的,c++坑也不少,两个凑到一起真是酸爽!