2015-09-29 27 views
-1

我對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; 

}

最近我一直在用標題進行艱難的時間。任何幫助是極大的讚賞!

+0

你如何建立你的計劃嗎?你能編輯到確切的生成線的問題嗎?你是否包含_both_'.o'(或者,'.cpp')文件? – Petr

+0

我輸入的全部內容是:「g ++ Word_Counter.cpp -o Word_Counter」。所有這三個文件都在同一個目錄中。 –

+0

哦,到底是什麼。我只是輸入「g ++ Word_Counter.cpp split.cpp」並且(在我修正了一個錯字之後)它就起作用了。這是爲什麼? –

回答

0

如果你有源文件分割成幾個文件,你需要讓編譯器意識到它們的全部。最簡單的方法是列出在命令行上的所有.cpp文件(不.h文件!):

g++ Word_Counter.cpp split.cpp -o Word_Counter 
+0

因此,即使Word_Counter.cpp包含split.h,編譯器也不會自動獲取split.cpp?我的頭文件實際上有什麼問題嗎? –

+0

@LiamTyler,我看到您的標題沒有問題。但是,只包含'#include'頭文件並不會使編譯器意識到相應的源代碼。它在更簡單的層面上工作:'#include'文件只是簡單地將文本插入'#include'的位置,僅此而已。 – Petr

+0

哦,我從來不知道它剛剛插入#include文本。非常感謝 –