2

boost::proto次の端末を使用して s 式オブジェクトを構築しようとしています。

        typedef proto::terminal< const char* >::type string_term_t;
        typedef proto::terminal< uint32_t >::type uint32_term_t;
        typedef proto::terminal< float >::type float_term_t;

そしてそれを次のように使用します:

void testInit()
{
    auto v = string_term_t("foo") , string_term_t("bla") , (float_term_t(5.6), string_term_t("some"));
    proto::display_expr(v);
}

ただし、これはコンパイルできません。

Test.cpp:18:33: error: no matching function for call to ‘boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char*>, 0l>::expr(const char [4])’
boost_1_46_0/boost/proto/proto_fwd.hpp:300:16: note: candidates are: boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char*>, 0l>::expr()
boost_1_46_0/boost/proto/proto_fwd.hpp:300:16: note:                 boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char*>, 0l>::expr(const boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const char*>, 0l>&)
Test.cpp:18:33: error: unable to deduce ‘auto’ from ‘&lt;expression error>’
Test.cpp:18:73: error: expected ‘)’ before ‘(’ token

私は何を間違っていますか?を使用してs式に類似または同等のものを取得する方法について何か提案はありますboost::protoか?

4

3 に答える 3

5

型はproto::expr<>コンストラクターを定義しません。したがって、あなたの問題。代わりに、次のように型を定義してみてください。

typedef proto::literal< const char* > string_term_t;
typedef proto::literal< uint32_t > uint32_term_t;
typedef proto::literal< float > float_term_t;
于 2012-04-07T20:51:29.410 に答える
1

あなたがそれを使用している方法に何か本質的に間違っていると思います。私はこれを読み始めたばかりので、まったくの初心者です。ただし、以下はコンパイルして何かを行います

#include <boost/proto/proto.hpp>

using namespace boost;

typedef proto::terminal< const char* >::type string_term_t;

void testInit()
{
  auto v = string_term_t ({"foo"});
  proto::display_expr(v);
}

int main()
{
  testInit();
  return 0;
}

特に、v の定義における「裸の」コンマの使用法が疑わしいことがわかりました。それが C++11 の新機能なのか、ブースト マジックなのかはわかりませんが、少なくともこのままでは機能するとは考えていません。

追加

少し遊んだ後、カンマ演算子は内側( )に囲まれた演算子 iff であり、「裸」の場合ではないことがわかりました。以下が機能しました

typedef proto::terminal< const char* >::type string_term_t;
typedef proto::terminal< uint32_t >::type uint32_term_t;
typedef proto::terminal< float >::type float_term_t;

void testInit()
{
  auto v = (string_term_t({"foo"}) , string_term_t({"bla"}) , (float_term_t({5.6}), string_term_t({"some"})));
  proto::display_expr(v);
}

(将来の読者のために書かれています。()同封{ "foo" }または削除できるものは何でも)。

于 2012-04-07T16:30:38.587 に答える