нет подходящей функции для вызова ‘regex_search (…) ‘

Учитывая старый стиль const char * указатель и длина, есть ли способ позвонить std::regex_search() на нем без предварительного копирования содержимого буфера в std::string? Вот простой пример проблемы, которую я имею:

#include <regex>

int main()
{
const char *text = "123 foobar 456";
const size_t len = strlen(text);

const std::regex rx(" (.+)bar");

std::smatch what;
std::regex_search( text, text+len, what, rx); // <- problematic line

return 0;
}

Я думал 5 станд :: regex_search () мне нужны два итератора, но я не совсем понимаю, как конвертировать указатели в итераторы. Когда я пытаюсь скомпилировать код выше, я получаю это:

g++ -std=c++11 test.cpp
test.cpp:11:45: error: no matching function for call to ‘regex_search(const char*&, const char*, std::smatch&, const regex&)’
/usr/include/c++/4.9/bits/regex.h:2131:5: note: template<class _Bi_iter, class _Alloc, class _Ch_type, class _Rx_traits> bool std::regex_search(_Bi_iter, _Bi_iter, std::match_results<_BiIter, _Alloc>&, const std::basic_regex<_CharT, _TraitsT>&, std::regex_constants::match_flag_type)
regex_search(_Bi_iter __s, _Bi_iter __e,

…и еще много ошибок!

Можно const char * преобразовать в нужный итератор? Я сделал это неправильно? Я неправильно понимаю, как это работает?

7

Решение

Ошибка в вашем коде в том, что вы используете неправильный match_results тип. smatch предполагается использовать, когда у вас есть std::string объект и вы передаете std::string::iteratorс regex функция. Когда у вас есть сырье char const *использование cmatch вместо.

+ Изменить

std::smatch what;

в

std::cmatch what;

Живая демо

9

Другие решения


По вопросам рекламы [email protected]