«Нет известного преобразования» от const char * до ошибки итератора — другой подход

Я делаю следующее:

using namespace boost;
const char* line = // ...
size_t line_length = // ...
// ...
tokenizer<escaped_list_separator<char> > line_tokenizer(
line, line + line_length,
escaped_list_separator<char>('\\', ',', '\"'));

Ожидая использовать boost::tokenizer конструктор

tokenizer(Iterator first, Iterator last,
const TokenizerFunc& f = TokenizerFunc())
: first_(first), last_(last), f_(f) { }

но GCC 4.9.3 дает мне:

no known conversion for argument 1 from ‘const char*’ to ‘__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >’

Теперь я видел пару связанные с вопросы в котором ответ забыл #include <algorithm> — но я иметь включил это. Есть еще какие-то пропущенные включения или это другая проблема?

0

Решение

Как говорит ошибка компилятора, нет способа собрать итератор из const char *. Вы можете исправить это, используя std :: string:

std::string line = "some string";
// ...
tokenizer<escaped_list_separator<char> > line_tokenizer(
line.begin(), line.end(),
escaped_list_separator<char>('\\', ',', '\"'));
1

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

вам нужно создавать итераторы токенов вручную, если вы не хотите использовать контейнер в качестве пространства поиска

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>

int main()
{
const char xx[] = "a,b,c,d,e,f,g";
auto line = xx;
size_t line_length = strlen(line);

using namespace boost;

auto f = escaped_list_separator<char>('\\', ',', '\"');
auto beg = make_token_iterator<char>(line ,line + line_length,f);
auto end = make_token_iterator<char>(line + line_length,line + line_length,f);
// The above statement could also have been what is below
// Iter end;
for(;beg!=end;++beg){
std::cout << *beg << "\n";
}
return 0;
}
0

Поскольку вы используете boost, вы можете сделать:

#include <boost/utility/string_ref.hpp>
// ...
const boost::string_ref line_(line, line_length);
tokenizer<escaped_list_separator<char> > line_tokenizer(
line_, escaped_list_separator<char>('\\', ',', '\"'));

и это похоже на работу. Узнайте больше о string_ref и других утилитах Вот.

Конечно, если у вас есть реализация библиотеки поддержки рекомендаций, используйте string_span (А.к.а. string_view) оттуда (Вотодна реализация). Это даже делает это в стандартной библиотеке, вероятно.

0