C++ ';解析';:不是boost::spirit::x3::unused_类型的成员

C++ ';解析';:不是boost::spirit::x3::unused_类型的成员,c++,boost,boost-spirit,boost-spirit-x3,C++,Boost,Boost Spirit,Boost Spirit X3,我试图使用Boost Spirit实现HTTP头解析器,但是我陷入了一个基本的子任务:从第一行提取HTTP版本号 简化代码: #include <boost/spirit/home/x3.hpp> #include <boost/fusion/adapted.hpp> #include <boost/fusion/sequence.hpp> #include <iostream> #include <string> namespace

我试图使用Boost Spirit实现HTTP头解析器,但是我陷入了一个基本的子任务:从第一行提取HTTP版本号

简化代码:

#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/adapted.hpp>
#include <boost/fusion/sequence.hpp>
#include <iostream>
#include <string>

namespace parser
{
    namespace ast
    {
        struct version_number
        {
            int major = 0;
            int minor = 0;
        };
    }

    using boost::fusion::operator<<;
}
BOOST_FUSION_ADAPT_STRUCT(
    parser::ast::version_number,
    (int, major)
    (int, minor)
)

namespace parser
{
    using namespace boost::spirit::x3;

    class version_number_id;
    rule<version_number_id, ast::version_number> version_number = "version_number";
    auto const version_number_def = eps
        >> int_
        >> "."
        >> int_
        ;
    BOOST_SPIRIT_DEFINE(rtsp_request_line)
}

int main()
{
    using namespace std;
    string input = "4.332";


    parser::ast::version_number vn;
    auto res = boost::spirit::x3::parse(begin(input), end(input), parser::version_number, vn);
    if (res)
    {
        cout << "Success" << endl;
    }
    else
    {
        cout << "Failure" << endl;
    }
}
#包括
#包括
#包括
#包括
#包括
名称空间分析器
{
名称空间ast
{
结构版本号
{
int-major=0;
int小调=0;
};
}
使用boost::fusion::运算符int_
>> "."
>>int_
;
增强精神定义(rtsp请求行)
}
int main()
{
使用名称空间std;
字符串输入=“4.332”;
解析器::ast::版本号vn;
auto res=boost::spirit::x3::parse(开始(输入),结束(输入),解析器::版本号,vn);
如果(res)
{

cout这只是MSVC的一个问题。目前不支持MSVC编译器

这在其他编译器上不是问题:

支持的编译器上的源代码:

有趣的是,我所知道的唯一一个在线MSVC编译器确实强调了这个诊断:MSVC只是不受支持(),尽管它给出了一个不同的错误——可能是因为那里的Boost 1.60.0

在GCC/Clang Boost 1.60.0上,虽然不是一个障碍:

  • CCC
  • 叮当声

在您的代码中有
BOOST\u SPIRIT\u DEFINE(rtsp\u request\u line)
,但是规则的实际名称是
版本号
。一旦这个错误被纠正,您的代码就可以通过BOOST 1.65.1和VC++2017 Update 3(编译器v19.11.25508)为我干净地编译了.

MSVC++14.1是Visual Studio 2014吗?我知道boost spirit x3与Visual Stuiod 2017兼容。谢谢您的帮助!您是否碰巧知道Microsoft编译器的哪些部分使其与当前的x3实现不兼容?我必须抵制说“所有部分”的强烈冲动。这很可能是标准一致性(MSVC仍然没有2阶段查找之类的功能)。可能只是LLVM前端位缓解了这些问题(?)。FWIW,MS声称VC++2017可以与X3一起使用(这也是我个人的经验)@sehe:我用Boost 1.65.1和VC++2017U3进行了检查,唯一的问题是打字错误。所以不管是什么问题,如果你是对的,它要么是在MSVC 14.10和14.11之间修复的,要么是在Boost 1.64.0和1.65.1之间修复的。我没有任何简便的方法来确定是哪一个。对落选者:请不要。我的答案有大量正确的信息。它还修复了问题样本中的po(我将其视为一个问题而忽略,因为它非常琐碎).最后,如果你有问题,只要问一个问题。我碰巧知道1.66.0中有一个不相关的错误在1.67.0中被修复,可能会导致问题标题中的确切错误消息。我可以将你链接到以下内容:Derp,我可以确认,当拼写错误被修复时,它确实会编译。哈-哦。我认为拼写错误太明显了(看起来规则名称“匿名化”出了问题)。你可以从我链接的许多(5…)在线副本中发现修复:)
1>------ Build started: Project: spirit_test, Configuration: Debug Win32 ------
1>main2.cpp
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\nonterminal\rule.hpp(36): error C2338: BOOST_SPIRIT_DEFINE undefined for this rule.
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\nonterminal\rule.hpp(116): note: see reference to function template instantiation 'boost::spirit::x3::detail::default_parse_rule_result boost::spirit::x3::parse_rule<parser::version_number_id,parser::ast::version_number,Iterator,Context,Attribute_>(boost::spirit::x3::rule<parser::version_number_id,parser::ast::version_number,false>,Iterator &,const Iterator &,const Context &,ActualAttribute &)' being compiled
1>        with
1>        [
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Context=boost::spirit::x3::unused_type,
1>            Attribute_=parser::ast::version_number,
1>            ActualAttribute=parser::ast::version_number
1>        ]
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\core\parse.hpp(35): note: see reference to function template instantiation 'bool boost::spirit::x3::rule<parser::version_number_id,parser::ast::version_number,false>::parse<Iterator,boost::spirit::x3::unused_type,Attribute>(Iterator &,const Iterator &,const Context &,boost::spirit::x3::unused_type,Attribute_ &) const' being compiled
1>        with
1>        [
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Attribute=parser::ast::version_number,
1>            Context=boost::spirit::x3::unused_type,
1>            Attribute_=parser::ast::version_number
1>        ]
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\core\parse.hpp(35): note: see reference to function template instantiation 'bool boost::spirit::x3::rule<parser::version_number_id,parser::ast::version_number,false>::parse<Iterator,boost::spirit::x3::unused_type,Attribute>(Iterator &,const Iterator &,const Context &,boost::spirit::x3::unused_type,Attribute_ &) const' being compiled
1>        with
1>        [
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Attribute=parser::ast::version_number,
1>            Context=boost::spirit::x3::unused_type,
1>            Attribute_=parser::ast::version_number
1>        ]
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\core\parse.hpp(60): note: see reference to function template instantiation 'bool boost::spirit::x3::parse_main<Iterator,Parser,Attribute>(Iterator &,Iterator,const Parser &,Attribute &)' being compiled
1>        with
1>        [
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Parser=boost::spirit::x3::rule<parser::version_number_id,parser::ast::version_number,false>,
1>            Attribute=parser::ast::version_number
1>        ]
1>d:\documents\visual studio 2017\projects\spirit_test\spirit_test\main2.cpp(49): note: see reference to function template instantiation 'bool boost::spirit::x3::parse<std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,boost::spirit::x3::rule<parser::version_number_id,parser::ast::version_number,false>,parser::ast::version_number>(const Iterator &,Iterator,const Parser &,Attribute &)' being compiled
1>        with
1>        [
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Parser=boost::spirit::x3::rule<parser::version_number_id,parser::ast::version_number,false>,
1>            Attribute=parser::ast::version_number
1>        ]
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\nonterminal\rule.hpp(37): error C2039: 'parse': is not a member of 'boost::spirit::x3::unused_type'
1>c:\devlib\boost_1_64_0\include\boost\spirit\home\x3\support\traits\attribute_category.hpp(22): note: see declaration of 'boost::spirit::x3::unused_type'
1>Done building project "spirit_test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped =========