C++ 使用boost spirit X3解析变体列表
我试图将一个简单的float或int列表解析为一个变量向量。我在Windows上使用Boost1.64(MingW64位) 下面是一个简单的例子:C++ 使用boost spirit X3解析变体列表,c++,boost,c++14,boost-spirit,boost-spirit-x3,C++,Boost,C++14,Boost Spirit,Boost Spirit X3,我试图将一个简单的float或int列表解析为一个变量向量。我在Windows上使用Boost1.64(MingW64位) 下面是一个简单的例子: #include <boost/spirit/home/x3/support/ast/variant.hpp> #include <boost/fusion/adapted/struct.hpp> #include <boost/spirit/home/x3.hpp> #include <iostream&
#include <boost/spirit/home/x3/support/ast/variant.hpp>
#include <boost/fusion/adapted/struct.hpp>
#include <boost/spirit/home/x3.hpp>
#include <iostream>
#include <vector>
namespace x3 = boost::spirit::x3;
struct var : x3::variant<int, float> {
using base_type::base_type;
using base_type::operator=;
};
struct block {
bool dummy; // needed to make newer boost version compile
std::vector<var> vars;
};
BOOST_FUSION_ADAPT_STRUCT(block,
(bool, dummy),
(std::vector<var>, vars)
);
x3::rule<class var, var> const r_var = "var";
x3::rule<class block, block> const r_block = "block";
auto const r_var_def = x3::float_ | x3::int_;
auto const r_block_def = x3::attr(true) >> *x3::lit(";") >> *(r_var >> -x3::lit(","));
BOOST_SPIRIT_DEFINE(r_var, r_block);
bool parse(std::string const &txt, block &ast)
{
using boost::spirit::x3::phrase_parse;
using boost::spirit::x3::space;
auto iter = txt.begin();
auto end = txt.end();
const bool parsed = phrase_parse(iter, end, r_block, space, ast);
return parsed && iter == end;
}
int main() {
std::vector<std::string> list = {
"1, 3, 5.5",
";1.0, 2.0, 3.0, 4.0"
};
for (const auto&i : list) {
block ast;
if (parse(i, ast)) {
std::cout << "OK: " << i << std::endl;
} else {
std::cout << "FAIL: " << i << std::endl;
}
}
}
有什么想法吗,为什么GCC不编译它?但它可以与叮当声一起工作
继续使用(切换到clang++以查看其工作情况)。使用继承的特殊成员似乎有问题。两个变通办法:
using var = x3::variant<int, float>;
使用var=x3::variant;
或者:
struct var : x3::variant<int, float> {
var ( ) = default;
var (var const&) = default;
var& operator= (var const&) = default;
using base_type::base_type;
using base_type::operator=;
};
结构变量:x3::variant{
var()=默认值;
var(var const&)=默认值;
var&operator=(var const&)=默认值;
使用基本类型::基本类型;
使用base_type::operator=;
};
struct var : x3::variant<int, float> {
var ( ) = default;
var (var const&) = default;
var& operator= (var const&) = default;
using base_type::base_type;
using base_type::operator=;
};