我如何转发声明boost ::精神统治

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

本文关键字:boost 声明 何转发 转发      更新时间:2023-10-16

这是一个非常简单的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;也是其定义,在此代码中,它使用默认构造函数来初始化它。只需省略那条线即可。

另外,如果要在另一个源文件中使用initializer提供parseTest定义,则必须将const声明为 extern,因为 const在global和名称空间范围范围内意味着内部链接( static)。

>
// .h
namespace parsers {
    extern const rule<it, test()> parseTest;
}
// .cc
const rule<it, test()> parsers::parseTest = int_ >> ',' >> int_;