我有以下代码,它工作正常,但是当我将iter getB(string& s , string& tag);
函数定义更改为iter getB(const string& s , const string& tag);
时,我得到的错误粘贴在最后。我相信没有定义=
运算符,因为有了这个新的函数定义,如果我不将search
的结果分配给i
程序编译,尽管后来会导致分段错误,我相信这是意料之中的。有人可以向我解释为什么当函数定义包含const
关键字时我无法分配search
的结果。谢谢。
代码:
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef string::iterator iter;
iter getB(string& s , string& tag);
int main (){
string line = "hello, how are you?";
string tag = "how";
iter i = getB(line,tag);
for(i ; i!=line.end(); i++){
cout << *i ;
}
cout << endl;
return 0;
}
iter getB(string& s , string& tag)
{
iter i;
i = search(s.begin() , s.end() , tag.begin() , tag.end());
return i;
}
~
~
更改函数定义的错误消息:
test1.cpp: In function ‘iter getB(const std::string&, const std::string&)’:
test1.cpp:24: error: no match for ‘operator=’ in ‘i = std::search [with _ForwardIterator1 = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _ForwardIterator2 = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >](((const std::string*)s)->std::basic_string<_CharT, _Traits, _Alloc>::begin [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](), ((const std::string*)s)->std::basic_string<_CharT, _Traits, _Alloc>::end [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](), ((const std::string*)tag)->std::basic_string<_CharT, _Traits, _Alloc>::begin [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](), ((const std::string*)tag)->std::basic_string<_CharT, _Traits, _Alloc>::end [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]())’
/usr/include/c++/4.2.1/bits/stl_iterator.h:637: note: candidates are: __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >& __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator=(const __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&)
对于const string
,begin()
和 end()
返回std::string::const_iterator
不std::string::iterator
。您可以将iterator
转换为const_iterator
,但反之则不然。
快速的解决方案是更改您的类型定义:
typedef string::const_iterator iter;
如果s
是一个const string &
,那么s.begin()
,因此search
的返回类型,是string::const_iterator
。这是不可转换为string::iterator
,这是i
的类型。
这是应该的,因为否则该转换将通过允许您修改字符串来破坏const
正确性。您应该将i
类型更改为 string::const_iterator
,或者如果您使用的是 C++11,则可能auto
。
const 迭代器传递给 std::search,则返回值也是 const 迭代器(它将与传入的第一个迭代器属于同一类型(
更改此内容:
typedef string::iterator iter;
对此:
typedef string::const_iterator iter;