push_back_aが誤動作?
boost::spirit::push_back_a(dst, val)
が正常に動いていないような気がします.
#include <boost/spirit.hpp> #include <boost/lambda/bind.hpp> #include <iostream> #include <string> #include <vector> struct TestGrammar : boost::spirit::grammar<TestGrammar> { std::vector<int>& ret; TestGrammar(std::vector<int>& ref): ret(ref){ } template<typename ST> struct definition { typedef boost::spirit::rule<ST> rule_t; rule_t r; rule_t s; definition(const TestGrammar& self){ using namespace boost::spirit; using namespace boost::lambda; r = int_p[push_back_a(self.ret)]; s = int_p[push_back_a(self.ret, 0)]; t = int_p[bind(&std::vector<int>::push_back, var(self.ret), 0)]; } const rule_t& start() const{ return r; } }; }; int main(){ std::string str = "425"; std::vector<int> v; if(boost::spirit::parse(str.begin(), str.end(), TestGrammar(v)).full) std::cout << v[0] << std::endl; }
非常に単純な例です.
ルールにrを使った場合は425と出ますが,sを使った場合は未定義値(0xccccccccとか)がでます.
Boost.Lambaを使ったtだととうまくいきます.
うーん,使い方が間違ってるのかな….