【问题标题】:BOOST_FUSION_ADAPT_ADT not finding setter methodBOOST_FUSION_ADAPT_ADT 找不到设置方法
【发布时间】:2020-07-22 12:15:59
【问题描述】:

我正在尝试将 BOOST_FUSION_ADAPT_ADT 应用于类,如下所示:

class XY {
private:
    std::string x; // lhs
    std::list<std::list<std::string>> y;

public:
    std::list<std::list<std::string>> const &getY() const {
        return y;
    }

    void setY(std::list<std::list<std::string>> const &y) {
        this->y = y;
    }

    std::string const &getX() const { return x; }

    void setX(std::string const &x) { this->x = x; }
};

但是,我收到以下错误,我不太清楚是什么问题。

xxxxxxxxxxxxxxx: error: no matching function for call to ‘Rule::setY(const std::__cxx11::basic_string<char>&)’
                        (std::list<std::list<std::string>> const&, std::list<std::list<std::string>> const&, obj.getY(), obj.setY(val))
                                                                                                                         ^
xxxxxxxxxxxxxxx: note: candidate: void Rule::setY(const std::__cxx11::list<std::__cxx11::list<std::__cxx11::basic_string<char> > >&)
     void setY(std::list<std::list<std::string>> const &y) {

【问题讨论】:

  • 我偷偷怀疑你可能正在编写解析器。过去我在灵气上使用 ADAPT_ADT 时运气不佳。基本上,我一直因为会员代理而遇到 UB。我希望它现在已经修复,但我个人不会打赌。

标签: c++ boost boost-fusion


【解决方案1】:

你没有播种你如何使用它。但是,当我尝试时没有问题:

Live On Compiler Explorer

#include <boost/fusion/adapted.hpp>
#include <boost/fusion/include/copy.hpp>
#include <string>
#include <list>
#include <fmt/ranges.h>
using namespace std::string_literals;
using Lists = std::list<std::list<std::string> >;

class XY {
  private:
    std::string x;
    Lists y;

  public:
    void setY(Lists       const& y) { this->y = y; }
    void setX(std::string const& x) { this->x = x; }

    [[nodiscard]] Lists       const& getY() const { return y; }
    [[nodiscard]] std::string const& getX() const { return x; }
};

BOOST_FUSION_ADAPT_ADT(XY,
        (obj.getX(), obj.setX(val))
        (obj.getY(), obj.setY(val))
    )

int main() {
    XY test;
    boost::fusion::copy(
        std::make_tuple("hello", Lists { {"world"s, "bye"s}, {"world"s} }),
        test);

    fmt::print("{}\n{}\n",
            test.getX(),
            test.getY());
}

打印

hello
{{"world", "bye"}, {"world"}}

【讨论】:

  • 我的坏 ` BOOST_FUSION_ADAPT_ADT(XY, (std::list<:list>> const&,std::list<:list>> const&, obj.getY(), obj.setY(val)) (std::string const&, std::string const&, obj.getX(), obj.setX(val)) ) `我认为属性的顺序ADAPT_ADT 中的排列应与类定义中的排列相匹配。当我更改订单时,它起作用了。
  • 订单不相关。如果有的话,它可能是模板参数,因为您使用的是带有指定类型的 pre-C++11 表单
  • 好的。更改语法以匹配您的仍然会标记错误。但是既然它将结构转换为融合序列,那么顺序不重要吗?
  • 是的,不应该。它不是“转换”——它是适应。您正在描述属性访问器。您可以按任何顺序执行此操作。 【其实你可以按不同的顺序来boost.org/doc/libs/1_73_0/libs/fusion/doc/html/fusion/adapted/…)
  • 这很奇怪,因为即使我在上面的解决方案中切换它们,编译器也会标记错误。
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多