如何转发声明boost :: spirit规则?

时间:2019-03-14 20:03:20

标签: c++ boost-spirit boost-spirit-qi

这是一个非常简单的boost::spirit示例,展示了我遇到的一个问题-编译时得到'parsers::parseTest': redefinition; multiple initialization-如何转发声明规则?如果需要,请使用2.5.2

#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <string>

struct test
{
    int a;
    int b;
};

BOOST_FUSION_ADAPT_STRUCT(test, a,b)


namespace parsers
{
    typedef std::string::const_iterator it;
    using namespace boost::spirit::qi;
    const rule<it, test()> parseTest;
}

namespace parsers
{
    typedef std::string::const_iterator it;
    using namespace boost::spirit::qi;
    const rule<it, test()> parseTest = int_ >> ',' >> int_;
}

1 个答案:

答案 0 :(得分:2)

常量声明const rule<it, test()> parseTest;也是其定义,在此代码中,它使用默认的构造函数对其进行初始化。只需省略该行。

或者,如果您想在另一个源文件中提供parseTest定义的初始化程序,则必须将const声明为extern,因为const在全局和命名空间范围内表示内部链接(static)。

// .h
namespace parsers {
    extern const rule<it, test()> parseTest;
}

// .cc
const rule<it, test()> parsers::parseTest = int_ >> ',' >> int_;