std ::リストでブースト::精神::チー::ルールを保存します
-
25-09-2019 - |
質問
私はブーストのためのコピーまたは参照セマンティクスについては、他のスレッドを読んだことがある:: spirt ::チー::ルールに。私はブースト1.42を使用しています。
using boost::spirit::qi::phrase_parse;
typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::ascii::space_type > rule_type;
std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
std::cout << typeid(char_).name() << std::endl;
ruleList.push_back(char_);
ruleList.push_back(*ruleList.back());
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::ascii::space));
assert(iter == s.end());
これは...
で失敗しますAssertion `phrase_parse(iter, s.end(), ruleList.back(), traits::space())' failed.
Aborted (core dumped)
STLリストまたは両端キューでルールを保存する方法はありますか? (削除されるまで、参照は死ぬことはない)。
解決
はブーストV1.45では、この(上記とは本質的にあなたのコードは)(MSVC2010、G ++ 4.5.1)問題なく動作します
#include <list>
#include <string>
#include <iostream>
#include <boost/spirit/include/qi.hpp>
using namespace boost::spirit;
int main()
{
typedef qi::rule<std::string::const_iterator, ascii::space_type> rule_type;
std::list<rule_type> ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
std::cout << typeid(qi::char_).name() << std::endl;
ruleList.push_back(qi::char_);
ruleList.push_back(*ruleList.back());
assert(qi::phrase_parse(iter, s.end(), ruleList.back(), ascii::space));
assert(iter == s.end());
return 0;
}
そこで、私はそれはあなたが使用している御霊のバージョンのバグだと仮定します。
他のヒント
私は、コンパイルにあなたの例を得ることができませんでした。別にusing
からの正しい種類を...::qi
ないから、あなたは()
型にtrait::space
を追加します。
この作品のw / Oの問題は私のために(ブースト1.44)
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <vector>
#include <cassert>
using boost::spirit::qi::phrase_parse;
typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::qi::space_type > rule_type;
int main() {
std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
ruleList.push_back(*boost::spirit::qi::char_);
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::qi::space));
assert(iter == s.end());
}
~>g++ test.cpp && ./a.out
~>
私はqi::space_type
と`qi::space
代わりのascii
名前空間を使用しますのでご注意ください。私はtrait
名前空間が何であるか/見当がつかないます。
所属していません StackOverflow