我正在尝试将单独的文件链接/引用以进行编译。我以前从未这样做过,所以我迷失了这个错误。 似乎就像我引用了我需要的东西。
我有三个文件,main.cpp,parser.cpp和header.h 主调用解析器来解析文本(虽然我还没能测试它是否真的有效:l)
main.cpp -
#include "header.h"
using namespace std; // I know this isn't recommended, I'm changing this later.
int main(){
string input, arg1, arg2;
vector<string> parsedIn;
cout << "<";
while(getline(cin, input)){
parsedIn = parser(input);
//more code, this is the only call to parser and compile error
//stops here
parser.cpp -
#include "header.h"
std::vector<std::string> parser(std::string &input){
int i=0;
//int begin=1;
int count=0;
std::vector<std::string> parsedIn;
while(i<input.length()){
char temp = input.at(i);
if(temp != ' '){
parsedIn[count] += temp;
count++;
}
i++;
}
if(count < 3)
parsedIn[0] = "Error"; // Set first value to "Error" to report an input issue
return parsedIn;
}
的 header.h 的
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
std::vector<std::string> parser(std::string &input);
我知道我也应该使用警卫,但我的TA并没有明确说明我如何设置这些......尽管如此。这是我第一次使用C ++,所以我想弄清楚为什么没有引用它。
当然,错误是对解析器的未定义引用。
编辑:我对代码进行了更改,以反映我在您的建议中所做的工作。
特别是解析(std :: string&amp; input)已成为解析器(std :: string&amp; input)
答案 0 :(得分:7)
parser.cpp的“解析器”方法拼写为“parse”,但是你的header.h说它的名字叫“解析器”。
答案 1 :(得分:3)
你还有另一个问题。
std::vector<std::string> parsedIn;
// ...
parsedIn[count] += temp;
向量parsedIn
的大小为0.在空向量上使用[]
会导致未定义的行为。您需要执行push_back操作才能向向量添加元素。与std::map
容器不同,您不能使用[]
运算符向向量添加元素。
答案 2 :(得分:0)
您无法链接您的文件。
小步骤:
1)如果您还没有,请写helloWorld
。源文件可以称为hello.cpp
。
2)而不是从源到可执行文件的一步构建,如下所示:
g++ hello.cpp
尝试构建目标文件,hello.o
,然后构建可执行文件:
g++ -c hello.cpp -o hello.o
g++ hello.o -o hello
3)添加一些小函数,称之为void foo()
,不带任何参数,不返回任何内容,打印出一些内容而不做任何其他操作。将其放入hello.cpp
并不要继续,直到它完美无缺。
4)将foo()
移动到其自己的源文件(foo.cpp
)和头文件(foo.h
)。现在不要担心头卫。像这样编译和构建:
g++ -c hello.cpp -o hello.o
g++ -c foo.cpp -o foo.o
g++ hello.o foo.o -o hello
如果你走得这么远,你做得很好。