从const char *到迭代器错误的“未知转换” - 另一种看法

时间:2016-04-12 13:45:53

标签: c++ string iterator tokenize boost-tokenizer

我正在做以下事情:

boost::tokenizer

期望使用tokenizer(Iterator first, Iterator last, const TokenizerFunc& f = TokenizerFunc()) : first_(first), last_(last), f_(f) { } 构造函数

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

但是GCC 4.9.3给了我:

#include <algorithm>

现在,我已经看到了几个related questions,其答案是忘记了[unixODBC][FreeTDS][SQL Server]Third [unixODBC][FreeTDS][SQL Server]Second [unixODBC][FreeTDS][SQL Server]First - 但我已经包含了它。还有其他一些缺失包括,还是另一个问题?

3 个答案:

答案 0 :(得分:1)

正如编译器错误所说,没有办法从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 :(得分: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;
}

答案 2 :(得分:1)

由于你正在使用提升,你可以这样做:

#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和其他实用程序here

当然,如果您有指南支持库的实施,请使用string_span(a.k.a。string_view)(here的一个实现)。它甚至可能进入标准库。

更新:string_view符合C ++ 17的C ++标准。现在你可以写:

#include <string_view>
// ...
std::string_view line_ { line, line_length };
tokenizer<escaped_list_separator<char> > line_tokenizer(
    line_, escaped_list_separator<char>('\\', ',', '\"'));