2011-05-28 112 views
0

我在我的節目的陳述做了兩個向量的元素的對比C++聲明編譯器錯誤

if(!*(it2+3).compare(*(lines_in_file.begin()))) 

編譯器錯誤我得到的是:

test_file.cpp:140: error: 'class __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >' has no member named 'compare' 

it2的類型是:

vector<std::string>::iterator it2=rec_vec.begin(); 

lines_in_file類型是:

vector<std::string> lines_in_file=split(argv[2],','); 

分割函數的聲明是:

std::vector<std::string> split(const std::string &s, char delim) 

我很困惑一個bit.already花了很多時間來思考。 任何人都可以幫忙嗎?

+1

就已經打破那堆積如山的表達。做數學運算:它比編譯器更令人迷惑_YOU_,現在它需要_MY_時間來修復你的錯誤。 OT:我認爲你正在重新創造差異算法。別。使用圖書館。 – sehe 2011-05-28 17:53:59

+0

一個好的編譯器會給出「不可讀的代碼」警告!你是否偶爾爲空格鍵付錢? – 2011-05-28 17:54:57

+1

不要使用'std :: string :: compare',使用'!='運算符。不要使用'*(lines_in_file.begin())'使用'lines_in_files.front()'。如果可能,儘量使用'const_iterator'(不知道這裏的用例)... – 2011-05-28 18:32:18

回答

4

問題是運營商「。」有更大的優先權,「*」,所以這應該解決問題。

if(!(*(it2+3)).compare(*(lines_in_file.begin()))) 
+1

詳細說明,運算符'.'比運算符'*'具有更高的優先級。添加括號給出了預期的解析。 – rlibby 2011-05-28 17:54:10

1

優先成員訪問運算符(.)的是間接運算符(*)的higher than the precedence。所以你的代碼被解釋爲:

if(!*((it2+3).compare(*(lines_in_file.begin())))) 

因此錯誤。 (多餘的空格是爲了清楚起見添加)

所以修復是這樣的:

if(! (*(it2+3)).compare(*(lines_in_file.begin()))) 
1

了*操作符應用於

(it2+3).compare(*(lines_in_file.begin())) 

結果這不是你想要的。只需使用():

(*(it2+3)).compare(*(lines_in_file.begin())) 
+0

哇。我們都在同一時間迴應,似乎! :] – etienne 2011-05-28 17:55:05

4

這是因爲.操作has higher precedence*運營商。使用此:

if(!(it2+3)->compare(*(lines_in_file.begin()))) 

或本

if(!(*(it2+3)).compare(*(lines_in_file.begin()))) 

(這是平等的)