如何转发声明 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_;
这是一个非常简单的 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_;