1

GCC 4.6.3で次のコードで次のエラーが発生する理由がよくわかりません

'boost::spirit::_a = boost::phoenix::function::operator()(const A0&) const [with A0 = boost::phoenix::actor >, F = make_line_impl] の 'operator=' に一致しません、typename boost::phoenix::as_composite、F、A0>::type = boost::phoenix::composite、boost::fusion::vector、boost::spirit::argument<0>、boost::fusion: :void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_ , boost::fusion::void_> >]((* & boost::spirit::_1))'</p>

遅延関数オブジェクトの結果を qi プレースホルダーに割り当てることさえ可能ですか?

#include <string>
#include <boost/spirit/include/phoenix_function.hpp>
#include <boost/spirit/include/qi.hpp>

using std::string;

using boost::spirit::qi::grammar;
using boost::spirit::qi::rule;
using boost::spirit::qi::space_type;
using boost::spirit::qi::skip_flag;
using boost::spirit::unused_type;

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

struct make_line_impl
{
  int* _context;
  make_line_impl(int* context)
  {
    _context = context;
  }

  template <typename Sig>
  struct result;

  template <typename This, typename Arg>
  struct result<This(Arg const &)>
  {
    typedef int* type;
  };
  template <typename Arg>
  int* operator()(Arg const & content)
  {
    return new int(5);
  }
};


template<typename Iterator>
struct MyGrammar : grammar<Iterator, unused_type, space_type>
{
  rule<Iterator, unused_type, space_type> start;
  rule<Iterator, int*(), space_type> label;
  rule<Iterator, string*(), qi::locals<int*>, space_type> line;

  MyGrammar() : MyGrammar::base_type(start)
  {
    make_line_impl mlei(new int(5));
    phx::function<make_line_impl> make_line(mlei);

    start = *(line);

    line = label[qi::_a = make_line(qi::_1)];
  }
};


int main(int argc, char **argv) {

  string contents;

  qi::phrase_parse(contents.begin(), contents.end(), MyGrammar<string::iterator>(), space_type(), skip_flag::postskip);
    return 0;
}
4

1 に答える 1

2

コードをコンパイルできるように、コードのいくつかの箇所を修正しました。

  • BOOST_RESULT_OF::result<>::typeのドキュメントに従って、ネストされたロジックを書き直しました。

    C++11 モードでコンパイルする場合は、おそらく次のように定義したほうがよいことに注意してください。

     #define BOOST_RESULT_OF_USE_DECLTYPE
    

    その場合、ネストされた結果タイプ テンプレートを気にする必要はありません。

  • operator(...)メソッドは const である必要がありました

結果のコード:

#include <string>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/qi.hpp>

using std::string;

using boost::spirit::qi::grammar;
using boost::spirit::qi::rule;
using boost::spirit::qi::space_type;
using boost::spirit::qi::skip_flag;
using boost::spirit::unused_type;

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

struct make_line_impl
{
  int* _context;
  make_line_impl(int* context)
  {
    _context = context;
  }

  template <typename Arg> struct result { typedef int* type; };

  template <typename Arg>
  int* operator()(Arg const & content) const
  {
    return new int(5);
  }
};


template<typename Iterator>
struct MyGrammar : grammar<Iterator, unused_type, space_type>
{
  rule<Iterator, unused_type, space_type> start;
  rule<Iterator, int*(), space_type> label;
  rule<Iterator, string*(), qi::locals<int*>, space_type> line;

  MyGrammar() : MyGrammar::base_type(start)
  {
    make_line_impl mlei(new int(5));
    phx::function<make_line_impl> make_line(mlei);

    start = *(line);

    line = label[qi::_a = make_line(qi::_1)];
  }
};


int main(int argc, char **argv) {

  string contents;

  qi::phrase_parse(contents.begin(), contents.end(), MyGrammar<string::iterator>(), space_type(), skip_flag::postskip);
    return 0;
}
于 2012-05-04T08:27:28.077 に答える