тип возврата для std :: search () - PullRequest
3 голосов
/ 04 ноября 2011

Я пытаюсь проверить пример 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, и получил ту же ошибку.Итак, какой должен быть правильный тип, это должен быть тип итератора контейнера?Спасибо

Ответы [ 5 ]

4 голосов
/ 04 ноября 2011

Как насчет того, чтобы просто не заботиться о типе возврата?:)

bool in_quote(const string& s){
    return search(quote.begin(), quote.end(), s.begin(), s.end()) != quote.end();
}
3 голосов
/ 04 ноября 2011

Я попробовал следующее

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

И он скомпилировался без ошибок ...

1 голос
/ 05 ноября 2011

Ранние реализации string могли легко использовать char* в качестве типа итератора, что позволило бы некорректно скомпилировать этот неправильный фрагмент кода. Большинство современных реализаций string::iterator имеют правильный тип класса и не могут быть преобразованы в char*.

Подпись для std::search равна :

template <class ForwardIterator1, class ForwardIterator2>
   ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                             ForwardIterator2 first2, ForwardIterator2 last2 );

Как видите, тип возвращаемого значения совпадает с типом первых двух итераторов, переданных функции. В вашем случае string::iterator должен был сработать, если только в какой-то части кода, которую вы нам не показали, было сделано quote const, в этом случае вы можете использовать string::const_iterator.

1 голос
/ 04 ноября 2011

У вас есть const string, поэтому это должно быть const_iterator:

string::const_iterator p = search(quote.begin(), quote.end(), s.begin(), s.end());
0 голосов
/ 04 ноября 2011

За Документация SGI , используемая форма search имеет подпись:

template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2);

Поскольку тип FowardIterator1 равен std::string::iterator, тип возврата долженбыть std::string::iterator также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...