Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用BOOST\u FUSION\u ADAPT\u ADT调整类时出错_C++_Boost_Grammar_Boost Spirit - Fatal编程技术网

C++ 使用BOOST\u FUSION\u ADAPT\u ADT调整类时出错

C++ 使用BOOST\u FUSION\u ADAPT\u ADT调整类时出错,c++,boost,grammar,boost-spirit,C++,Boost,Grammar,Boost Spirit,我上过以下课程: #ifndef WFRACTAL_FRACTAL_METADATA_H_ #define WFRACTAL_FRACTAL_METADATA_H_ #include <string> namespace WFractal { namespace Fractal { class Metadata { public: void setAuthorName(const std::string &name); void setAuthorE

我上过以下课程:

#ifndef WFRACTAL_FRACTAL_METADATA_H_
#define WFRACTAL_FRACTAL_METADATA_H_

#include <string>

namespace WFractal {
namespace Fractal {

class Metadata {

public:

    void setAuthorName(const std::string &name);
    void setAuthorEMail(const std::string &email);
    void setBriefDescription(const std::string &brief);
    void setCompleteDescription(const std::string &description);
    std::string getAuthorName() const;
    std::string getAuthorEMail() const;
    std::string getBriefDescription() const;
    std::string getCompleteDescription() const;

public:

    bool operator==(const Metadata &other);

private:

    std::string m_name;
    std::string m_email;
    std::string m_brief;
    std::string m_description;
};

} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_METADATA_H_
我从中了解到,我可以使用
BOOST\u FUSION\u ADAPT\u STRUCT
来解析它。这是我的语法模板:

#ifndef WFRACTAL_FRACTAL_PARSER_METADATAGRAMMAR_H_
#define WFRACTAL_FRACTAL_PARSER_METADATAGRAMMAR_H_

#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/spirit/include/qi_no_case.hpp>
#include <string>
#include "Fractal/Metadata.h"

BOOST_FUSION_ADAPT_ADT(
    WFractal::Fractal::Metadata,
    (obj.getAuthorName(), obj.setAuthorName(val))
    (obj.getAuthorEMail(), obj.setBriefDescription(val))
    (obj.getBriefDescription(), obj.setCompleteDescription(val))
    (obj.getCompleteDescription(), obj.setAuthorEMail(val))
)

namespace WFractal {
namespace Fractal {
namespace Parser {

template <typename Iterator>
struct MetadataParser : boost::spirit::qi::grammar<Iterator, Metadata(), boost::spirit::ascii::space_type> {
    MetadataParser() : MetadataParser::base_type(start) {
        using boost::spirit::qi::int_;
        using boost::spirit::qi::lit;
        using boost::spirit::qi::double_;
        using boost::spirit::qi::lexeme;
        using boost::spirit::ascii::char_;
        using boost::spirit::ascii::no_case;

        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

        start %=
        no_case[lit("metadata")]
        >> '{'
        >>  no_case[lit("author")] >> '=' >> quoted_string >> ';'
        >>  no_case[lit("email")] >> '=' >> quoted_string >> ';'
        >>  no_case[lit("brief")] >> '=' >> quoted_string >> ';'
        >>  no_case[lit("description")] >> '=' >> quoted_string >> ';'
        >>  '}'
        ;
    }

    boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> quoted_string;
    boost::spirit::qi::rule<Iterator, Metadata(), boost::spirit::ascii::space_type> start;
};

} // namespace Parser
} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_PARSER_METADATAGRAMMAR_H_
\ifndef WFRACTAL\u FRACTAL\u PARSER\u METADATAGRAMMAR\u H_
#定义WFRACTAL\u FRACTAL\u PARSER\u METADATAGRAMMAR\u H_
#包括
#包括
#包括
#包括
#包括“Fractal/Metadata.h”
增强融合自适应ADT(
WFractal::Fractal::元数据,
(obj.getAuthorName(),obj.setAuthorName(val))
(obj.getAuthorEMail(),obj.setBriefDescription(val))
(obj.getBriefDescription(),obj.setCompletedDescription(val))
(obj.getCompletedDescription(),obj.setAuthorEMail(val))
)
命名空间WFractal{
命名空间分形{
名称空间分析器{
模板
结构MetadataParser:boost::spirit::qi::grammar{
MetadataParser():MetadataParser::基本类型(开始){
使用boost::spirit::qi::int;
使用boost::spirit::qi::lit;
使用boost::spirit::qi::double;
使用boost::spirit::qi::lexeme;
使用boost::spirit::ascii::char;
使用boost::spirit::ascii::no_case;
quoted_string%=词素[''''>>+(字符'''')>'''];
起始百分比=
无案例[lit(“元数据”)]
>> '{'
>>无大小写[lit(“author”)]>'='>>引用的字符串>>';'
>>无大小写[lit(“email”)]>'='>>引用的字符串>>';'
>>无大小写[lit(“brief”)]>'='>>引用的字符串>>';'
>>无大小写[lit(“description”)]>'='>>引用的字符串>>';'
>>  '}'
;
}
boost::spirit::qi::规则引用\u字符串;
提升::精神::气::规则开始;
};
}//名称空间解析器
}//命名空间分形
}//命名空间WFractal
#endif/!WFRACTAL\u FRACTAL\u PARSER\u METADATAGRAMMAR\u H_
当我创建此语法的实例时(始终遵循页面示例),我得到编译器错误:

typedef string::const_iterator StringIterator;
typedef Parser::MetadataParser<StringIterator> MetadataParser;
MetadataParser parser;
typedef string::const_迭代器StringIterator;
类型定义解析器::MetadataParser MetadataParser;
元数据分析器;
我得到了很多错误(典型的boost…),我注意到其中有很多错误的副本:

src/Fractal/FileFactory.cpp:27:17:   required from here
/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:152:18: error: no matching function for call to ‘boost::fusion::extension::adt_attribute_proxy<WFractal::Fractal::Metadata, 0, false>::adt_attribute_proxy(const std::__cxx11::basic_string<char>&)’
             attr = static_cast<Attribute>(val);
src/Fractal/FileFactory.cpp:27:17:此处为必填项
/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:152:18:错误:调用“boost::fusion::extension::adt_attribute_proxy::adt_attribute_proxy(const std::u cxx11::basic_string&)”时没有匹配的函数
attr=静态(val);
我做错了什么?我怎样才能修复它

编辑

根据m.s.的建议,我添加了
#include
标题,但这不起作用

#ifndef WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_
#define WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_

#include <boost/config/warning_disable.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 <boost/fusion/include/io.hpp>
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/spirit/include/support_adapt_adt_attributes.hpp>
#include <string>
#include "Fractal/Metadata.h"

BOOST_FUSION_ADAPT_ADT(
    WFractal::Fractal::Metadata,
    (obj.getAuthorName(), obj.setAuthorName(val))
    (obj.getAuthorEMail(), obj.setAuthorEMail(val))
    (obj.getBriefDescription(), obj.setBriefDescription(val))
    (obj.getCompleteDescription(), obj.setCompleteDescription(val))
)

namespace WFractal {
namespace Fractal {
namespace Parser {

template <typename Iterator>
struct MetadataParser : boost::spirit::qi::grammar<Iterator, Metadata(), boost::spirit::ascii::space_type> {
    MetadataParser() : MetadataParser::base_type(start) {
        using boost::spirit::qi::lit;
        using boost::spirit::qi::lexeme;
        using boost::spirit::ascii::char_;
        using boost::spirit::ascii::no_case;

        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

        start %=
        no_case[lit("metadata")]
        >> '{'
        >> ((no_case[lit("author")] >> '=' >> quoted_string >> ';')
        ^  (no_case[lit("email")] >> '=' >> quoted_string >> ';')
        ^  (no_case[lit("brief")] >> '=' >> quoted_string >> ';')
        ^  (no_case[lit("description")] >> '=' >> quoted_string >> ';'))
        >>  '}'
        ;
    }

    boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> quoted_string;
    boost::spirit::qi::rule<Iterator, Metadata(), boost::spirit::ascii::space_type> start;
};

} // namespace Parser
} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_
\ifndef WFRACTAL\u FRACTAL\u PARSER\u METADATAPARSER\u H_
#定义WFRACTAL\u FRACTAL\u PARSER\u METADATAPARSER\u H_
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“Fractal/Metadata.h”
增强融合自适应ADT(
WFractal::Fractal::元数据,
(obj.getAuthorName(),obj.setAuthorName(val))
(obj.getAuthorEMail(),obj.setAuthorEMail(val))
(obj.getBriefDescription(),obj.setBriefDescription(val))
(obj.getCompletedDescription(),obj.setCompletedDescription(val))
)
命名空间WFractal{
命名空间分形{
名称空间分析器{
模板
结构MetadataParser:boost::spirit::qi::grammar{
MetadataParser():MetadataParser::基本类型(开始){
使用boost::spirit::qi::lit;
使用boost::spirit::qi::lexeme;
使用boost::spirit::ascii::char;
使用boost::spirit::ascii::no_case;
quoted_string%=词素[''''>>+(字符'''')>'''];
起始百分比=
无案例[lit(“元数据”)]
>> '{'
>>((无大小写[lit(“author”)]>>'='>>引用的字符串>>';'))
^(无大小写[lit(“email”)]>>'='>>引用的字符串>>';')
^(无大小写[lit(“brief”)]>>'='>>带引号的字符串>>';')
^(无大小写[lit(“description”)]>'='>>引用的字符串>>';'))
>>  '}'
;
}
boost::spirit::qi::规则引用\u字符串;
提升::精神::气::规则开始;
};
}//名称空间解析器
}//命名空间分形
}//命名空间WFractal
#endif/!WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_
Hmm

经过与模块化Boost和git的长期斗争。。。我发现这是一种倒退

此拉取请求部分修复了回归:

遗憾的是,它仍然在置换解析器的存在下被破坏。我已经用
BOOST\u FUSION\u ADAPT\u STRUCT
进行了测试,以验证它没有以其他方式损坏

我会将减少的样本添加到PR中以供评论。同时,这是自制的复制机:

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted.hpp>
#include <iostream>

class Foo {
  public:
    char const& getA() const { return a; } 
    char const& getB() const { return b; } 

    void setA(char value)    { a = value; } 
    void setB(char value)    { b = value; } 
  private:
    char a, b;
};

BOOST_FUSION_ADAPT_ADT(
        Foo,
        (char const&, char const&, obj.getA(), obj.setA(val))
        (char const&, char const&, obj.getB(), obj.setB(val))
    )


int main() {
    namespace qi = boost::spirit::qi;

    boost::spirit::istream_iterator f(std::cin), l; // input e.g. "a=a;b=b;"
    Foo foo;

    bool r = qi::parse(f, l,
#if 0 // FAILS TO COMPILE
                      ("a=" >> qi::char_ >> ';')
                    ^ ("b=" >> qi::char_ >> ';')
#else // COMPILES WITH FIX FROM PR #153
                      ("a=" >> qi::char_ >> ';')
                   >> ("b=" >> qi::char_ >> ';')
#endif 
                , foo);

    if (r)
        std::cout << "Parsed: " << boost::fusion::as_vector(foo) << "\n";
    else
        std::cerr << "Parse failed\n";
}
注意当然,这是假设您使用的分支应用了PR 153


在pr中添加了简化的复制器:好的,我将等待下一个版本,同时我将使用一个中间结构来读取数据并将它们放入类中。添加的行也是一个好主意,我会检查它。感谢您的支持。@cv_和_他,除非它不起作用。这就是我回答的全部要点。否则我只会指向公关部。还需要做更多的工作,我想1.60已经开始了freeze@cv_and_he干杯我将删除“现在有噪音”comments@NikitaKniazev是的,你找到了一个我记得的。最新的相关修复可能是Spirit X3也有同样的问题
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted.hpp>
#include <iostream>

class Foo {
  public:
    char const& getA() const { return a; } 
    char const& getB() const { return b; } 

    void setA(char value)    { a = value; } 
    void setB(char value)    { b = value; } 
  private:
    char a, b;
};

BOOST_FUSION_ADAPT_ADT(
        Foo,
        (char const&, char const&, obj.getA(), obj.setA(val))
        (char const&, char const&, obj.getB(), obj.setB(val))
    )


int main() {
    namespace qi = boost::spirit::qi;

    boost::spirit::istream_iterator f(std::cin), l; // input e.g. "a=a;b=b;"
    Foo foo;

    bool r = qi::parse(f, l,
#if 0 // FAILS TO COMPILE
                      ("a=" >> qi::char_ >> ';')
                    ^ ("b=" >> qi::char_ >> ';')
#else // COMPILES WITH FIX FROM PR #153
                      ("a=" >> qi::char_ >> ';')
                   >> ("b=" >> qi::char_ >> ';')
#endif 
                , foo);

    if (r)
        std::cout << "Parsed: " << boost::fusion::as_vector(foo) << "\n";
    else
        std::cerr << "Parse failed\n";
}
Parsed: (a b)