Как переслать объявление правила boost :: spirit? - PullRequest
0 голосов
/ 14 марта 2019

Вот очень простой 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 Ответ

2 голосов
/ 14 марта 2019

Объявление константы 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_;
...