= 未为 std 定义::使用 const 字符串时搜索



我有以下代码,它工作正常,但是当我将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 stringbegin()end() 返回std::string::const_iteratorstd::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; 

最新更新