2011-05-28 101 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()))) 

(这是平等的)