我對C++很陌生,並且通過一本名爲「Accelerated C++」的書。在其中一個章節中,假設您製作一個程序,給定一串文本,告訴您每個單詞出現在哪一行。爲了打破字符串中的所有單詞,我使用了一個名爲'split'的函數,它來自於不同的源文件,但是包含了它的頭文件,所以我可以使用它。它雖然沒有工作。對於我的生活中,我想不通爲什麼鏈接器告訴我「未定義的引用 '分裂(的std :: string常量&)'C++,對函數的undefined引用,儘管包含它的頭文件
split.cpp:
#include <string>
#include <cctype>
#include <vector>
#include "split.h"
using namespace std;
bool space(char c) {
return isspace(c);
}
bool not_space(char c) {
return !isspace(c);
}
vector<string> split(const string& s) {
vector<string> ret;
string::const_iterator i = s.begin();
while (i != s.end()) {
i = find_if(it, s.end(), not_space);
string::const_iterator j = i;
j = find_if(j, s.end(), space);
if (i != s.end())
ret.push_back(string(i, j));
i = j;
}
return ret;
}
split.h:
#ifndef GUARD_split_h
#define GUARD_split_h
#include <string>
#include <vector>
bool space(char);
bool not_space(char);
std::vector<std::string> split(const std::string&);
#endif
Word_Counter.cpp:
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include "split.h"
using namespace std;
map<string, vector<int> > xref(istream& in, vector<string>
find_words(const string&) = split) {
string line;
int line_number = 0;
map<string, vector<int> > ret;
while (getline(in, line)) {
++line_number;
vector<string> words = find_words(line);
for (vector<string>::const_iterator it = words.begin();
it != words.end(); it++)
ret[*it].push_back(line_number);
}
return ret;
}
int main() {
map<string, vector<int> > ret = xref(cin);
for(map<string, vector<int> >::const_iterator it = ret.begin();
it != ret.end(); it++) {
cout << it->first << "occurs on line(s): ";
vector<int>::const_iterator line_it = it->second.begin();
cout << *line_it;
line_it++;
while(line_it != it->second.end()) {
cout << ", " << *line_it;
line_it++;
}
cout << endl;
}
return 0;
}
最近我一直在用標題進行艱難的時間。任何幫助是極大的讚賞!
你如何建立你的計劃嗎?你能編輯到確切的生成線的問題嗎?你是否包含_both_'.o'(或者,'.cpp')文件? – Petr
我輸入的全部內容是:「g ++ Word_Counter.cpp -o Word_Counter」。所有這三個文件都在同一個目錄中。 –
哦,到底是什麼。我只是輸入「g ++ Word_Counter.cpp split.cpp」並且(在我修正了一個錯字之後)它就起作用了。這是爲什麼? –