#c #boost-spirit #boost-spirit-qi
#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:
Объявление константы 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_;