BOOST_FUSION_ADAPT_ADT找不到 setter 方法

BOOST_FUSION_ADAPT_ADT not finding setter method

提问人:user2987773 提问时间:7/22/2020 最后编辑:user2987773 更新时间:7/24/2020 访问量:83

问:

我正在尝试将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) {
C++ Boost-Fusion

评论

0赞 sehe 7/23/2020
我偷偷怀疑你可能在写一个解析器。我过去在灵气中使用ADAPT_ADT时运气不好。基本上,由于成员代理,我一直遇到 UB。我希望它现在已经修复,但我个人不会打赌。

答:

0赞 sehe 7/23/2020 #1

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

Live On 编译器资源管理器

#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"}}

评论

0赞 user2987773 7/23/2020
我的坏' BOOST_FUSION_ADAPT_ADT(XY, (std::list<std::list<std::string>> const&,std::list<std::list<std::string>> const&, obj.getY(), obj.setY(val)) (std::string const&, std::string const&, obj.getX(), obj.setX(val)) ) ' 我认为ADAPT_ADT中属性的顺序应该与类定义中的排列相匹配。当我更改顺序时,它起作用了。
0赞 sehe 7/23/2020
顺序不能相关。如果有的话,它可能是模板参数,因为您使用的是具有指定类型的 C++11 之前的表单
0赞 user2987773 7/23/2020
好。更改语法以匹配您的语法仍会标记错误。但是,既然它正在将结构转换为融合序列,那么顺序不应该重要吗?
0赞 sehe 7/23/2020
是的,它不应该。这不是“转换”——而是适应。您正在描述属性访问器。您可以按任何顺序执行此操作。[事实上,您可以按不同的顺序执行此操作 boost.org/doc/libs/1_73_0/libs/fusion/doc/html/fusion/adapted/......)
0赞 user2987773 7/23/2020
这很奇怪,因为即使我在上面的解决方案中切换它们,编译器也会标记错误。