我正在尝试使用boost::proto
在以下终端上构建s-expression对象:
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 ‘<expression error>’
Test.cpp:18:73: error: expected ‘)’ before ‘(’ token
我做错了什么?任何建议如何使用
boost::proto
获得类似于s表达式的东西? 最佳答案
我怀疑您的使用方式存在某些内在错误。我刚刚开始阅读this,所以我完全是新手。但是,以下内容可以编译并执行某些操作
#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" }
或任何可删除的内容)。