Skip to content

NodeRef: const methods do not participate in overload resolution #294

@biojppm

Description

@biojppm

Originally posted by @captain-yoshi in #293 (comment)

I would have though that iterating a NodeRef children's would work (implicitly converting them to a ConstNodeRef) :

  ryml::Tree tree;
  ryml::NodeRef node = tree.rootref();
  
  auto const& path_constraints = node["path_constraints"];

  for (ryml::ConstNodeRef const& path_constraint : path_constraints.children())
  {
    ...
  }

The above didin't compile:

/home/captain-yoshi/ws/ros/mimic_ws/src/moveit_benchmark_suite/mtc/src/pickplace_builder.cpp:286:80: error: passing ‘const c4::yml::NodeRef’ as ‘this’ argument discards qualifiers [-fpermissive]
  286 |     for (ryml::ConstNodeRef const& path_constraint : path_constraints.children())
      |                                                                                ^
In file included from /home/captain-yoshi/ws/ros/mimic_ws/src/moveit_serialization/serialization/include/moveit_serialization/ryml/std/std.h:41,
                 from /home/captain-yoshi/ws/ros/mimic_ws/src/moveit_serialization/serialization/include/moveit_serialization/ryml/conversions.h:42,
                 from /home/captain-yoshi/ws/ros/mimic_ws/src/moveit_benchmark_suite/core/include/moveit_benchmark_suite/serialization/ryml.h:41,
                 from /home/captain-yoshi/ws/ros/mimic_ws/src/moveit_benchmark_suite/core/include/moveit_benchmark_suite/robot.h:47,
                 from /home/captain-yoshi/ws/ros/mimic_ws/src/moveit_benchmark_suite/mtc/include/moveit_benchmark_suite/mtc/pickplace_profiler.h:56,
                 from /home/captain-yoshi/ws/ros/mimic_ws/src/moveit_benchmark_suite/mtc/src/pickplace_builder.cpp:5:
/home/captain-yoshi/ws/ros/mimic_ws/src/moveit_serialization/serialization/ext/ryml/src/c4/yml/node.hpp:1109:25: note:   in call to ‘c4::yml::NodeRef::children_view c4::yml::NodeRef::children()’
 1109 |           children_view children()       { return       children_view(begin(), end()); }
      |                         ^~~~~~~~

By switching the auto keyword with the ConstRefNode it worked:

// auto const& path_constraints = node["path_constraints"];
ryml::ConstRefNode const& path_constraints = node["path_constraints"];

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions