我正在尝试从Stroustup的书中测试一个search()
的例子。
string quote("why waste time learning, when ignorance is instantaneous?");
bool in_quote(const string& s){
char* p = search(quote.begin(), quote.end(), s.begin(), s.end());
return p != quote.end();
}
void test(){
bool b1 = in_quote("learning"); // b1=true
bool b2 = in_quote("lemming"); // b2=false
}
但是我收到以下错误:
error C2440: 'initializing' : cannot convert from
'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'char *'
看起来返回类型不对。我也试过了string::iterator
,并得到了同样的错误。那么,什么应该是正确的类型,它应该是容器的迭代器类型?感谢
答案 0 :(得分:4)
如何不关心返回类型? :)
bool in_quote(const string& s){
return search(quote.begin(), quote.end(), s.begin(), s.end()) != quote.end();
}
答案 1 :(得分:3)
我尝试了以下
bool in_quote(const string& s){
string::iterator p = search(quote.begin(), quote.end(), s.begin(), s.end());
return p != quote.end();
}
它确实编译没有错误......
答案 2 :(得分:1)
您有const string
,因此必须是const_iterator
:
string::const_iterator p = search(quote.begin(), quote.end(), s.begin(), s.end());
答案 3 :(得分:1)
string
的早期实现很容易使用char*
作为迭代器类型,允许这个不正确的代码段正确编译。 string::iterator
的大多数现代实现具有适当的类类型,并且不能转换为char*
。
std::search
is的签名:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2 );
如您所见,返回类型与传递给函数的前两个迭代器的类型相同。在您的情况下string::iterator
应该有效,除非您没有向我们展示代码的某些部分quote
const
,在这种情况下您可以使用string::const_iterator
。< / p>
答案 4 :(得分:0)
根据SGI documentation,您使用的search
形式具有签名:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2);
由于您的FowardIterator1
类型为std::string::iterator
,因此您的返回类型也必须为std::string::iterator
。