我正在嘗試使用boost.spirit庫編寫csv文件的解析器。下面的編譯錯誤我在boost.spirit新的,所以可能有人查明原因boost.spirit編譯錯誤:無法將參數1從「const char *」轉換爲「std :: _ String_iterator <std :: _ String_val>
的錯誤信息是:?
錯誤C2664:「布爾的boost ::精神::齊::規則::解析(Iterator &,const迭代器&,上下文&,const Skipper &,屬性&)缺點T:爲const char *'不能轉換參數1 '' 到 '的std :: _ String_iterator >> &'
而且我的代碼是:
#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;
};
該代碼是真正從Simplest way to read a CSV file mapped to memory?收養,所以我沒有任何線索。我正在使用Microsoft Visual Studio 2015並提升1.16.0。
如果我用typedef std::string
替換typedef boost::string_ref CsvField
,或者將字段的解析器替換爲field = *(~char_(",\r\n"))
,則會發生同樣的錯誤。
另外,我解析的文件實際上是一個標準的csv文件,因此任何有關替代解析方法的建議都是值得歡迎的。唯一的問題是該文件有數百萬行,所以標準的逐行解析不適用於我。