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

How do I forward declare a boost::spirit rule?

这是一个非常简单的 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_;
}

常量声明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_;