Как мне перенаправить объявление правила boost :: spirit?

#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_;