- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我编译以下代码时出现此错误:
boost\spirit\home\qi\detail\assign_to.hpp(164): error C2440: 'static_cast' : cannot convert from 'const wchar_t' to 'element_type'
第 164 行正上方的注释如下:
// This handles the case where the attribute is a single element fusion
// sequence. We silently assign to the only element and treat it as the
// attribute to parse the results into.
我已阅读帖子“Spirit Qi attribute propagation issue with single-member struct”,因此将 qi::eps
添加到所有规则中。但是,这并不能解决问题,所以我也尝试了上面文章中的解决方法 #1 和 #3,但也无济于事。因此,我完全不确定该错误是否与单元素 fusion 序列有关...
我该如何解决这个问题?
-马里奥
#pragma once
#include <string>
#include <vector>
#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/qi_alternative.hpp>
namespace nsunic = boost::spirit::unicode;
namespace nsqi = boost::spirit::qi;
namespace overmath
{
struct identifier
{
std::wstring name;
};
struct assignment
{
identifier variable_reference;
identifier expression;
};
struct statement
{
assignment assign;
};
struct statement_list
{
std::vector<statement> statements;
};
struct function
{
identifier name;
statement_list slist;
};
struct program
{
std::vector<function> functions;
};
}
BOOST_FUSION_ADAPT_STRUCT(
overmath::identifier,
(std::wstring, name)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::assignment,
(overmath::identifier, variable_reference)
(overmath::identifier, expression)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::statement,
(overmath::assignment, assign)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::statement_list,
(std::vector<overmath::statement>, statements)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::function,
(overmath::identifier, name)
(overmath::statement_list, slist)
)
BOOST_FUSION_ADAPT_STRUCT(
overmath::program,
(std::vector<overmath::function>, functions)
)
namespace overmath
{
template<typename Iterator> struct function_parser : nsqi::grammar<Iterator, program(), nsqi::space_type>
{
function_parser() : function_parser::base_type(program)
{
identifier %=
nsqi::eps
>> +nsqi::alnum;
assignment %=
nsqi::eps
>> identifier
>> nsqi::char_('=')
>> identifier;
statement %=
nsqi::eps
>> assignment;
statement_list %=
nsqi::eps
>> +statement;
function %=
nsqi::eps
>> nsqi::lit("def")
>> identifier
>> nsqi::char_('(')
>> nsqi::char_(')')
>> statement_list
>> nsqi::lit("enddef");
program %=
nsqi::eps
>> +function;
}
nsqi::rule<Iterator, identifier()> identifier;
nsqi::rule<Iterator, assignment(), nsqi::space_type> assignment;
nsqi::rule<Iterator, statement(), nsqi::space_type> statement;
nsqi::rule<Iterator, statement_list(), nsqi::space_type> statement_list;
nsqi::rule<Iterator, function(), nsqi::space_type> function;
nsqi::rule<Iterator, program(), nsqi::space_type> program;
};
template<typename Iterator> std::wstring parse(Iterator first, Iterator last)
{
using nsqi::phrase_parse;
program f;
function_parser<Iterator> fp;
auto b = phrase_parse(first, last, fp, nsqi::space, f);
if(b)
{
return std::wstring(L"OK");
}
return std::wstring(L"FAIL");
}
}
最佳答案
你的一些规则有一个常见的问题,即在你链接的问题中解释的适应结构中有一些类似容器的东西作为单个元素,但是你已经通过添加 qi::eps 回避了它(即使它并不是真正需要的)。
您的代码的错误是由于您的 assignment
规则。它的属性为 overmath::assignment
这基本上是 your_attr=tuple<identifier,identifier>
.如果我们分析它的综合属性,我们会发现它是 synt_attr=tuple<identifier,wchar_t,identifier>
.当 Spirit 解析您的规则时,它会尝试将综合属性分配给您的属性。它将 synt_attr 的第一个元素分配给 your_attr(标识符到标识符,没问题),然后它尝试分配第二个元素(wchar_t 到标识符)但它不起作用。由于标识符是一个改编的结构(基本上是一个 fusion 序列 tuple<wstring>
),它使 wchar_t 成为一个单一的元素序列 tuple<wchar_t>
并尝试分配它(wchar_t 到 wstring,但失败),导致错误。
所以问题是您有一个不应该存在的额外 wchar_t。这是由于您使用了 char_('=')
, 如果你使用 lit('=')
(甚至 omit[char_('=')]
)它应该可以工作。
关于c++ - Spirit::Boost编译错误可能与单元素 fusion 序列有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34135919/
我有一个 fusion 集,想将其转换成 fusion 图。 #include #include #include #include #include #include #include
我是 fusion 新手。是否可以在 fusion 图中嵌套 fusion 图?在下面的示例中,我如何编写代码来解析为 B? #include #include #include struct
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
我正在寻找有关使用 Fusion Tables 时的技术限制的信息:- - Fusion Table 中可以存储多少行 - 可以针对融合表同时运行多少查询(读/写)。 我在 https://devel
我正在使用 Fusion Table 进行多重查询。直到昨天我都使用 numericID 但今天创建了一个新表,FT 在关于菜单中没有显示数字 ID。我试图用 Ecrypted 更改 NUmeric
我很确定我知道我的代码有什么问题,但我不确定如何修复它。 我有一个谷歌融合表,我正在查询它以生成一个包含单选按钮的菜单。页面上还有一个 map ,它是一个像谷歌地图一样可视化的谷歌融合表。 当我对几个
在运行npx create-fusion-app my-app时,我收到以下错误。npm版本是5.6.0,node版本是8.11.2。 Creating a new Fusion.js app in:
我正在努力学习 boost fusion,但我不清楚 zip_view 和 zip 函数结果之间的区别。 namespace fuz = boost::fusion; typedef fuz::vec
我在 Google Cloud Data Fusion 中部署了一个数据管道,但它没有按预期工作。有没有办法在 Cloud Data Fusion 中编辑已部署的数据管道,还是必须将其删除并从头开始重
我有使用 Google Data Fusion 仅运行几个小时的生产管道。我想停止数据融合实例并在第二天启动它。我没有看到停止实例的选项。无论如何我们可以停止实例并再次启动同一个实例吗? 最佳答案 根
我们每天可以向 Fusion Tables 发出的请求数量是否有硬性限制?如果有,有多少人知道超出该限制的定价计划(如果有)? 最佳答案 限制是每天 25000 个请求,读取方法算作一个请求,写请求算
我已读过 https://developers.google.com/fusiontables/docs/developers_guide#Writ ...想要了解一下,但我想知道是否有完整的教程来展
我们每天可以向 Fusion Tables 发出的请求数量是否有硬性限制?如果有,有多少人知道超出该限制的定价计划(如果有)? 最佳答案 限制是每天 25000 个请求,读取方法算作一个请求,写请求算
我正在尝试使用 boost::fusion::vector。但是,我遇到了这个非常简单的问题。 #include #include #include #include using namesp
我正在评估用于内部项目的 Google Cloud Data Fusion,我希望能够设置 Data Fusion 实例、定义和部署计划管道,然后关闭 Data Fusion 实例。但是,当实例关闭时
我目前在 10.9 上运行 VMware Fusion 6。我知道在 ESX 中,我相信即使是 VMware Workstation,您也可以将 VM 导出为 OVF 文件,然后在 VirtualBo
尝试将 salesforce 连接器配置为使用 Google Data Fusion 从 salesforce 读取数据,但无法连接到 Salesforce。 点击连接器上的“获取架构”按钮时,我不断
我有: auto my_vec2 = boost::fusion::make_vector(42,false,42); auto my_set2 = boost::fusion::as_set(my_
Cloud Data Fusion 会为每次管道运行创建一个新的 Dataproc 集群。我已经有一个 24x7 运行的 Dataproc 集群设置,我想使用该集群来运行管道 最佳答案 这可以通过使用
我有一个包含大约 1000 个表的 MS SQL Server 数据源,我需要将其放入 BigQuery。我希望使用 Data Fusion 将它们全部加载到 BigQuery 中的暂存表中,然后再对
我是一名优秀的程序员,十分优秀!