【问题标题】:C++ Undefined reference when using class member in constructor在构造函数中使用类成员时的 C++ 未定义引用
【发布时间】:2016-11-28 12:35:41
【问题描述】:

我对 C++ 还很陌生,所以这个问题听起来可能很愚蠢,但即使我在谷歌上搜索了一段时间,我也找不到答案。我用的是ROS环境,不过我的问题应该是一般的C++问题,所以决定贴在这里。

我有两个代码

1)

ros::Duration max_storage_time = ros::Duration().fromNSec(1ULL * 1000000000LL);
tf::TimeCache odometryCache(max_storage_time);

2)

tf::TimeCache odometryCache(ros::Duration max_storage_time = ros::Duration().fromNSec(1ULL * 1000000000LL));

第二个编译,而第一个不编译。对我来说,似乎完全一样。第一个代码的错误是: 对tf::TimeCache::TimeCache(ros::Duration)的未定义引用

tf::TimeCache 的文档可以在http://docs.ros.org/jade/api/tf/html/c++/classtf_1_1TimeCache.html#acca87a70aeb9c3573cdbfec26f6bfe23找到

有人可以告诉我我缺少什么吗?代码片段的区别在哪里,为什么第一个不能编译?

提前致谢!

【问题讨论】:

  • 当您执行ros::Duration max_storage_time = ros::Duration().fromNSec(1ULL * 1000000000LL) 时,您想在构造函数调用中做什么?你复制了ros::Duration max_storage_time = 部分吗?
  • 是的,我确定,第二个(仅使用一行)有效。

标签: c++ variables constructor ros


【解决方案1】:

问题是您没有正确链接到 ROS 库。
解决方案是正确设置链接器。

只有第一个实际调用了任何 ROS 函数 - 第二个声明了一个接受 ros::Duration 并返回 tf::TimeCache 的函数(这被称为“最令人头疼的解析”)。

如果你从不尝试使用odometryCache,第二个不会造成任何问题。
如果你这样做(例如,odometryCache.clearList()),编译器会抱怨你试图访问非聚合类型的成员,或者类似的东西。

如果你不尝试命名构造函数的参数:

tf::TimeCache odometryCache(ros::Duration().fromNSec(1ULL * 1000000000LL));

它会编译,但链接会像第一块一样失败。

【讨论】:

    【解决方案2】:

    tf::TimeCache odometryCache(ros::Duration max_storage_time = ros::Duration().fromNSec(1ULL * 1000000000LL));

    这是函数odometryCache的声明,而不是对tf::TimeCache的构造函数的调用。这在 C++ 中被称为“最令人头疼的解析”。

    这里的正确修复很简单:

    tf::TimeCache odometryCache(ros::Duration().fromNSec(1ULL * 1000000000LL))

    或者,如果 C++11 可用:

    tf::TimeCache odometryCache{ ros::Duration().fromNSec(1ULL * 1000000000LL) }

    【讨论】:

    • 抱歉,您的选项都没有编译,而我的这个版本的代码正在编译
    • 正如另一个答案中所说,问题出在与 ROS 的链接中,所以你的答案也是正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多