C ++在构造函数中使用类成员时的未定义引用

时间:2016-11-28 12:35:42

标签: c++ variables constructor ros

我对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)

的未定义引用

可以在http://docs.ros.org/jade/api/tf/html/c++/classtf_1_1TimeCache.html#acca87a70aeb9c3573cdbfec26f6bfe23

找到tf :: TimeCache的文档

有人可以告诉我我错过了什么吗?代码片段之间的区别在哪里以及为什么第一个不编译?

提前致谢!

2 个答案:

答案 0 :(得分:3)

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) }

答案 1 :(得分:3)

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

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

如果您从未尝试使用odometryCache,则第二个不会导致任何问题 如果你这样做(例如,odometryCache.clearList()),编译器会抱怨你正在尝试访问非聚合类型的成员,或者那些行。

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

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

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