Я не уверен, связано ли это с Ошибка при адаптации класса с BOOST_FUSION_ADAPT_ADT , но даже если это так, вопрос, стоящий за ним, до сих пор не получен / все еще не найден, см. Комментарий автора Ошибка при адаптации класса с помощью BOOST_FUSION_ADAPT_ADT .(Я использовал boost 1.69)
У меня есть структура
#include <string>
#include <cstdint>
namespace rtsp {
struct request {
};
struct response {
uint_fast16_t rtsp_version_major;
uint_fast16_t rtsp_version_minor;
uint_fast16_t status_code;
std::string reason_phrase;
};
using message = boost::variant<request, response>;
}
, которую я смог использовать с boost::spirit::qi
через
BOOST_FUSION_ADAPT_STRUCT(
rtsp::response,
(uint_fast16_t, rtsp_version_major)
(uint_fast16_t, rtsp_version_minor)
(uint_fast16_t, status_code)
(std::string, reason_phrase)
, но теперь я тожехочу генерировать, а не только анализировать структуру, используя boost :: spirit :: karma. Я должен использовать
BOOST_FUSION_ADAPT_ADT(
rtsp::response,
(uint_fast16_t,const uint_fast16_t&,obj.rtsp_version_major, obj.rtsp_version_major = val)
(uint_fast16_t,const uint_fast16_t&,obj.rtsp_version_minor, obj.rtsp_version_minor = val)
(uint_fast16_t,const uint_fast16_t&,obj.status_code, obj.status_code = val)
(std::string,const std::string&,obj.reason_phrase, obj.reason_phrase = val)
)
Но он взрывается с несколькими ошибками, от ошибок шаблона до синтаксических ошибок, например, с
В файле, включенном в /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/include/rtsp_request.hpp:11: В файле, включенном в / Users / markus / include / boost/spirit/include/qi.hpp:16: в файле, включенном из /Users/markus/include/boost/spirit/home/qi.hpp:14: в файле, включенном в / Users / markus / include / boost / spirit / home/qi/action.hpp:14: в файле, включенном в /Users/markus/include/boost/spirit/home/qi/action/action.hpp:16: / Users / markus / include / boost / spirit / home / qi/detail/attributes.hpp:153:9: ошибка: неоднозначные частичные специализации 'transform_attribute, unsigned short, boost :: spirit :: qi :: domain, void>': transform_attribute
Поскольку в строке #include <boost/spirit/include/qi.hpp>
он уже не работает, может быть, кто-то знает, как исправить фразу BOOST_FUSION_ADAPT_ADT
?
Весь код: / *!@file rtsp_request.hpp * * /
#ifndef RTSP_GUI_RTSP_PARSER_HPP
#define RTSP_GUI_RTSP_PARSER_HPP
#include <string>
#include <cstdint>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/spirit/include/support_adapt_adt_attributes.hpp>
namespace rtsp {
struct request {
};
struct response {
uint_fast16_t rtsp_version_major;
uint_fast16_t rtsp_version_minor;
uint_fast16_t status_code;
std::string reason_phrase;
};
using message = boost::variant<request, response>;
}
BOOST_FUSION_ADAPT_ADT(
rtsp::response,
(uint_fast16_t,const uint_fast16_t&,obj.rtsp_version_major, obj.rtsp_version_major = val)
(uint_fast16_t,const uint_fast16_t&,obj.rtsp_version_minor, obj.rtsp_version_minor = val)
(uint_fast16_t,const uint_fast16_t&,obj.status_code, obj.status_code = val)
(std::string,const std::string&,obj.reason_phrase, obj.reason_phrase = val)
)
/*
BOOST_FUSION_ADAPT_STRUCT(
rtsp::response,
(uint_fast16_t, rtsp_version_major)
(uint_fast16_t, rtsp_version_minor)
(uint_fast16_t, status_code)
(std::string, reason_phrase)
)*/
namespace rtsp {
template<typename Iterator>
struct rtsp_response_grammar
: ::boost::spirit::qi::grammar<Iterator, response()> {
rtsp_response_grammar() : rtsp_response_grammar::base_type(start) {
namespace ns = ::boost::spirit::standard;
using ::boost::spirit::qi::uint_parser;
using ::boost::spirit::qi::lexeme;
using ::boost::spirit::qi::lit;
using boost::spirit::qi::omit;
using ::boost::spirit::qi::repeat;
quoted_string %= lexeme['"' >> +(ns::char_ - '"') >> '"'];
status_code = uint_parser<uint_fast16_t, 10, 3, 3>();
at_least_one_digit = uint_parser<uint_fast16_t, 10, 1>();
start %= lit("RTSP/") >> at_least_one_digit >> "." >> at_least_one_digit >> omit[+ns::space]
>> status_code >> omit[+ns::space]
>> *(ns::char_ - (lit("\r") | lit("\n")))
>> lit("\r\n");
}
boost::spirit::qi::rule<Iterator, std::string()> quoted_string;
boost::spirit::qi::rule<Iterator, uint_fast16_t()> status_code;
boost::spirit::qi::rule<Iterator, uint_fast16_t()> at_least_one_digit;
boost::spirit::qi::rule<Iterator, response()> start;
};
template <typename OutputIterator>
bool generate_response(OutputIterator sink, const response& reponse)
{
using ::boost::spirit::karma::lit;
return boost::spirit::karma::generate(sink, lit("RTSP/"), reponse);
}
}
#endif //RTSP_GUI_RTSP_PARSER_HPP
/*! @file rtsp_request.cpp
*
*/
#include "rtsp_request.hpp"
#include <iterator>
template
struct rtsp::rtsp_response_grammar<std::string::const_iterator>;
template
bool rtsp::generate_response<std::back_insert_iterator<std::string>>(std::back_insert_iterator<std::string> sink, const response& reponse);
Кстати, попытка просто использовать BOOST_FUSION_ADAPT_STRUCT с функцией генератора кармы также приведет к ошибке:
В файле включеноиз /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/src/rtsp_request.cpp:5: в файл включен из / Users / markus / Entwicklung / HTW / RTSP-Streaming / src / streaming_lib / include / rtspre_.hpp: 11: В файл включен из /Users/markus/include/boost/spirit/include/qi.hpp:16: В файл включен из /Users/markus/include/boost/spirit/home/qi.hpp:14: В файл включен из /Users/markus/include/boost/spirit/home/qi/action.hpp:14: в файл включен из /Users/markus/include/boost/spirit/home/qi/action/action.hpp: 14: В файл включен из /Users/markus/include/boost/spirit/home/qi/meta_compiler.hpp:15: В файл включен из /Users/markus/include/boost/spirit/home/qi/domain.hpp: 18: В файл включен из /Users/markus/include/boost/spirit/home/support/context.hpp:18: В файл включен из / Users / markus / include / boost / spirit / home / support / нетерминал / expand_arg.hpp: 20: /Users/markus/include/boost/spirit/home/support/string_traits.hpp:156:26: ошибка: неявное создание экземпляранеопределенный шаблон 'boost :: spirit :: traits :: char_type_of' typedef typename char_type_of :: type char_type;^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:242:14: note: при создании экземпляра класса шаблона 'boost :: spirit :: traits :: extract_c_string', запрашиваемого здесь typename extract_c_string :: char_typeconst * ^ /Users/markus/include/boost/spirit/home/karma/string/lit.hpp:180:21: примечание: при замене выведенных аргументов шаблона в шаблон функции 'get_c_string' [with String = rtsp :: response]get_c_string (^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:69:45: note: в реализации специализации шаблона функции 'boost :: spirit :: karma :: literal_string :: generate
, mpl _ :: int_ <0>, boost :: spirit :: unused_type>, boost :: spirit :: context, boost :: spirit :: localals>, boost :: spirit :: unused_type,rtsp :: response> 'запрошенный здесь возвращает compile (expr) .generate (сток, контекст, не используется, attr); ^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:91:23:примечание: в реализации специализации шаблона функции
«Подталкивание :: дух :: карма :: генерировать
, mpl _ :: int_ <0>, boost :: proto :: exprns _ :: expr>>, 0>, rtsp :: response> '
просили здесь
вернуть карму :: генерировать (сток, expr, attr);
^ /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/include/rtsp_request.hpp:69:38:
примечание: в реализации специализации шаблона функции
«Подталкивание :: дух :: карма :: генерировать
, boost :: proto :: exprns _ :: expr>>, 0>, rtsp :: response> '
просили здесь
return boost :: spirit :: karma :: generate (сток, горит ("RTSP /"), ответ);
^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:96:12:
примечание: шаблон объявлен здесь
struct char_type_of;
^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:179:20:
ошибка: не найдена соответствующая функция для вызова 'call'
return extract_c_string :: call (str);
^ ~~~~~~~~~~~~~~~~~~~~~~~~ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:238:42:
примечание: в реализации функции-члена
'Повышение :: дух :: черты :: extract_c_string :: называют'
просили здесь
return extract_c_string :: call (str);
^ /Users/markus/include/boost/spirit/home/karma/string/lit.hpp:180:21:
примечание: в реализации специализации шаблона функции
'boost :: spirit :: traits :: get_c_string' запрошен
Вот
get_c_string (
^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:69:45:
примечание: в реализации специализации шаблона функции
«Подталкивание :: дух :: карма :: literal_string :: генерировать
, mpl _ :: int_ <0>, boost :: spirit :: unused_type>, boost :: spirit :: context, boost :: spirit :: locals>, boost :: spirit :: unused_type, rtsp :: response> 'запрошено
Вот
return compile (expr) .generate (сток, контекст, не используется, attr);
^ /Users/markus/include/boost/spirit/home/karma/generate.hpp:91:23:
примечание: в реализации специализации шаблона функции
«Подталкивание :: дух :: карма :: генерировать
, mpl _ :: int_ <0>, boost :: proto :: exprns _ :: expr>>, 0>, rtsp :: response> '
просили здесь
вернуть карму :: генерировать (сток, expr, attr);
^ /Users/markus/Entwicklung/HTW/RTSP-Streaming/src/streaming_lib/include/rtsp_request.hpp:69:38:
примечание: в реализации специализации шаблона функции
«Подталкивание :: дух :: карма :: генерировать
, boost :: proto :: exprns _ :: expr>>, 0>, rtsp :: response> '
просили здесь
return boost :: spirit :: karma :: generate (сток, горит ("RTSP /"), ответ);
^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:159:25:
примечание: шаблон кандидата игнорируется: невозможно сопоставить 'T ' с
'RTSP :: ответ'
статический T const вызов (T * str)
^ /Users/markus/include/boost/spirit/home/support/string_traits.hpp:165:25:
примечание: шаблон кандидата игнорируется: невозможно сопоставить const T с
'RTSP :: ответ'
статический T const вызов (T const * str)