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