在 class 中声明 tf2_ros::Buffer 时出现构建错误

Building error when declare tf2_ros::Buffer in class

我正在尝试在简单代码中使用 tf2_ros::Buffer。当我把它放在主要功能中时,一切正常。但是当放入 class 时,会出现构建错误。代码是这样的:

#include <ros/ros.h>
#include <tf2_ros/buffer.h>
#include <tf2_ros/transform_listener.h>
#include <geometry_msgs/TransformStamped.h>
#include <geometry_msgs/Twist.h>

class test_class

{
private:
    double start;
    double duration;
    ros::Time start_time;
    ros::Time end_time;
    std::string robot_name;

    tf2_ros::Buffer tf_buffer; // problem line
    tf2_ros::TransformListener* tfListener;
    geometry_msgs::TransformStamped transformStamped;

public:
    std::string space_name;
    std::string node_name;

    test_class()
    {
        space_name = ros::this_node::getNamespace();
        node_name = ros::this_node::getName();
    }

    ~test_class()
    {}

    bool initialize(const ros::NodeHandle& n)
    {
        ROS_INFO("Class auto_mav_flight initialized done!");
        return true;
    }
    void timer_callback(const ros::TimerEvent& event)
    {
        ROS_INFO("Timer Callback triggered.");
        return;
    }
}; 

int main(int argc, char** argv)
{
    ros::init(argc, argv, "auto_mav_node");
    ros::NodeHandle node;
    ROS_WARN("The node is initilized and started.");
    test_class amf = test_class();
    amf.initialize(node);
    ros::Timer timer_1 = node.createTimer(ros::Duration(0.5), &test_class::timer_callback, &amf);
    ros::spin();
    return EXIT_SUCCESS;
}

构建错误信息为:

/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp: In function ‘int main(int, char**)’:
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:73:44: error: no matching function for call to ‘test_class::test_class(test_class)’
  test_class amf = test_class();
                                            ^
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:73:44: note: candidates are:
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:26:2: note: test_class::test_class()
  test_class()
  ^
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:26:2: note:   candidate expects 0 arguments, 1 provided
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:9:7: note: test_class::test_class(test_class&)
 class test_class
       ^
/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:9:7: note:   no known conversion for argument 1 from ‘test_class’ to ‘test_class&’
make[2]: *** [auto_mav_flight/CMakeFiles/auto_mav_flight_node.dir/src/node_main.cpp.o] Error 1
make[1]: *** [auto_mav_flight/CMakeFiles/auto_mav_flight_node.dir/all] Error 2
make: *** [all] Error 2

我发现如果我注释声明 tf2_ros::buffer:

的代码行
 tf2_ros::Buffer tf_buffer;

错误消失。

为什么 tf2_ros::Buffer 会导致 class 构造问题,即使我只是将其声明为 class 的成员?

我们将不胜感激。

提前致谢。

来自这里:

/home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:26:2: note: candidate expects 0 arguments, 1 provided /home/arkin/ros_code/sandbox/auto_mav_sandbox/src/auto_mav_flight/src/node_main.cpp:9:7: note: test_class::test_class(test_class&)

您似乎正在调用 test_class 的复制构造函数(可能隐藏在 ROS 层中,通过尝试将 test_class 作为函数参数传递或使用容器时)。

来自 tf2_ros::Buffer header, it inherits from BufferCore,其中包含不可复制构造的 boost::mutex(除其他事项外 - 可能有超过 1 个不可复制的属性)。这使得 tf2_ros::Buffer 不可复制构造。 由于test_class没有定义复制构造函数并且包含不可复制的属性,编译器无法生成复制构造函数并且在您尝试调用复制构造函数时编译失败。

供参考: http://en.cppreference.com/w/cpp/language/copy_constructor