【发布时间】:2015-05-02 15:01:13
【问题描述】:
使用 Phoenix bind 编写 Qi 语法我遇到了类似的编译错误
boost/spirit/home/support/context.hpp(180):错误 C2338:index_is_out_of_bounds
这里
>> ruleHandId_[phx::bind(&parseContext::handId_, qi::_r1) = qi::_1];
我只是对凤凰绑定没有太多经验,但在行中绑定了perv
ruleStart_ = ruleEncoding_[phx::bind(&parseContext::encoding_, qi::_r1) = qi::_1]
运行良好,没有编译错误
这一切都在 VS2013 的 MSVC 下,带有 boost 1.56 x86
我在编译错误的代码下做错了什么?
源代码
#include <boost/spirit/include/qi.hpp>
#include <boost/phoenix/phoenix.hpp>
#include <boost/shared_ptr.hpp>
#include <sstream>
namespace sp = boost::spirit;
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
struct parseContext {
std::string encoding_;
uint64_t handId_;
};
typedef boost::shared_ptr<parseContext> parseContextShPtr;
template <typename Iterator>
struct parseGrammar : qi::grammar<Iterator, void(parseContext&)> {
parseGrammar() : parseGrammar::base_type(ruleStart_)
{
ruleStart_ = ruleEncoding_[phx::bind(&parseContext::encoding_, qi::_r1) = qi::_1]
>> ruleHandHeader_;
ruleEncoding_ = qi::lit("ABC");
ruleHandHeader_ = qi::lit("DEF") >> qi::space
>> qi::lit("XYZ #")
>> ruleHandId_[phx::bind(&parseContext::handId_, qi::_r1) = qi::_1];
ruleHandId_ = qi::long_long;
}
// Rules
qi::rule<Iterator, void(parseContext&)> ruleStart_;
qi::rule<Iterator, std::string()> ruleEncoding_;
qi::rule<Iterator> ruleHandHeader_;
qi::rule<Iterator, uint64_t> ruleHandId_;
};
void test()
{
std::string s("ABCDEF XYZ #555: PQI #777");
std::stringstream sb;
sb.unsetf(std::ios::skipws);
sb << s;
const parseGrammar<sp::istream_iterator> p;
sp::istream_iterator b(sb);
sp::istream_iterator e;
parseContextShPtr ctx(new parseContext);
bool r = qi::parse(b, e, p(phx::ref(*ctx.get())));
if (r) {
std::cout << "Success" << std::endl;
}
else {
std::cout << "Failure" << std::endl;
}
std::cout << std::string(b, e).substr(0, 32) << std::endl;
}
【问题讨论】:
-
不可能告诉你出了什么问题,因为你没有显示任何相关代码。如果你隔离那些显然不能说明为什么它不起作用的东西,而是加强它应该通过类比起作用的期望,你基本上只是在抱怨/抱怨。 (您可以改为给您的编译器写一封信。它的工作效率差不多。)使其成为 SSCCE 或至少显示相关声明
-
添加源代码,抱歉
-
您确实意识到我们设法发布了一个答案,一个编辑建议,在您正确编辑问题的时间内改进了编辑建议 :) 并且您在此过程中恢复了格式改进...现在看
标签: c++ boost-spirit boost-spirit-qi boost-phoenix