boost.spiritライブラリを使用してcsvファイルのパーサーを作成しようとしています。次のコンパイルエラー私はboost.spiritで新しいですので、誰かがその理由を特定することができboost.spiritコンパイルエラー: "const char *"から "std :: _ String_iterator <std :: _ String_val>に変換できません。
エラーメッセージは次のとおりです。?
エラーC2664:「後押しBOOL ::精神::チー::ルール:: parse(反復子&、constイテレータ&、文脈&、constスキッパー&、属性&)cons T ':から引数1を変換することはできません ':コードは本当にSimplest way to read a CSV file mapped to memory?から採用されている
#pragma once #define BOOST_SPIRIT_USE_PHOENIX_V3 #include<vector> #include<string> #include<memory> #include<boost/iostreams/device/mapped_file.hpp> // for mmap #include<boost/utility/string_ref.hpp> #include<boost/spirit/include/qi.hpp> #include<boost/spirit/include/qi_grammar.hpp> #include<boost/spirit/include/qi_real.hpp> #include<boost/spirit/include/phoenix.hpp> #include<boost/spirit/include/qi_symbols.hpp> typedef boost::string_ref CsvField; typedef std::vector<CsvField> CsvLine; typedef std::vector<CsvLine> CsvFile; namespace qi = boost::spirit::qi; template <typename T> struct CsvParser : qi::grammar<T, CsvFile()> { CsvParser() : CsvParser::base_type(lines) { using namespace qi; using boost::phoenix::construct; using boost::phoenix::size; using boost::phoenix::begin; using boost::spirit::qi::float_; field = raw[*~char_(",\r\n")][_val = construct<CsvField>(begin(qi::_1), size(qi::_1))]; // semantic action //field = qi::float_; line = field % ','; lines = line % eol; } // declare: line, field, fields qi::rule<T, CsvFile()> lines; qi::rule<T, CsvLine()> line; qi::rule<T, CsvField()> field; };
ので、あるのstd :: _ String_iterator >> & '
そして、私のコード' から' のconstのchar *私は何の手がかりも持っていません。私はMicrosoft Visual Studio 2015を使用し、1.16.0を向上させています。
このエラーは、typedef boost::string_ref CsvField
をtypedef std::string
に置き換えるか、フィールドのパーサーをfield = *(~char_(",\r\n"))
に置き換えた場合に発生します。
また、私が解析しているファイルは実際には標準のCSVファイルなので、代替の解析方法の提案は歓迎します。唯一の捉え方は、ファイルに何百万もの行があることです。そのため、標準の行単位の解析は私のためには機能しません。