2011-11-04 99 views
3

我想从Stroustup的书中测试search()的示例。返回类型为std :: 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

如果您有C++ 11,请使用'auto'。但它看起来应该是'std :: string :: iterator'。当你尝试那个时,什么信息?它应该是一个不同的信息。 –

+0

@ubbdd迭代器不是**指针。 – Mahesh

+0

打开“输出”窗口查看_full_消息的方式。它应该告诉你那里有'_Elem'的类型 –

回答

3

我尝试以下

bool in_quote(const string& s){ 
    string::iterator p = search(quote.begin(), quote.end(), s.begin(), s.end()); 
    return p != quote.end(); 
} 

而且它并没有编译错误...

+0

我刚刚发现在复制代码时我纠正了一个错字。字符串::迭代器应该工作。谢谢。 – ubbdd

1

你有const string,所以它必须是一个const_iterator

string::const_iterator p = search(quote.begin(), quote.end(), s.begin(), s.end()); 
+0

我不这么认为:'search'的返回类型与前两个参数相同(毕竟它是'quote'的一个迭代器)。并且'quote'不是const ... – MartinStettner

+1

实际的规则是什么?搜索字符串是'const',但搜索的字符串不是。 –

+1

@MartinStettner:看起来你是对的。但我有充分的理由认为所提供的代码不是确实无效的代码。 – ybungalobill

4

怎么样根本不关心返回类型? :)

bool in_quote(const string& s){ 
    return search(quote.begin(), quote.end(), s.begin(), s.end()) != quote.end(); 
} 
+0

良好的实用答案,但问题更多的是为什么来自权威参考书的代码示例不起作用。 –

+0

@Mark:页码? – fredoverflow

+0

很可能在以后的版本中纠正了错误。我没有这本书,但Google有它:http://books.google.com/books?id=Bk4iAQAAIAAJ&q=%22why+waste+time+learning,+when+ignorance+is+instantaneous%22&dq=% 22why +浪费+时间+学习,+当+无知+ +瞬间%22&hl = en&ei = 30S0ToSxKc30sQKQqqT7Aw&sa = X&oi = book_result&ct = result&resnum = 2&ved = 0CDMQ6AEwAQ –

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为好。

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应该已经工作,除非有一部分代码你没有告诉我们,使quoteconst在这种情况下,你可以使用string::const_iterator