2016-11-28 944 views
0

我對C++很新,所以這個問題聽起來很愚蠢,但即使我搜索了一段時間,但找不到答案。我使用ROS環境,但我的問題應該是一個普通的C++問題,所以我決定在這裏發佈它。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

發現可能有人請告訴我,我缺少的是什麼?代碼段和第一個爲什麼不能編譯的區別在哪裏?

在此先感謝!

+0

當你在'ros :: Duration max_storage_time = ros :: Duration()。from NSec(1ULL * 1000000000LL)''時,你在構造函數調用中做了什麼?你有沒有複製'ros :: Duration max_storage_time ='部分? – NathanOliver

+0

是的,我相信,第二個(只使用一行)的作品。 – YeahScience

回答

3

的問題是,你不正確的連接ROS庫。
解決方案是正確設置鏈接器。

只有第一個實際調用任何ROS函數 - 第二個聲明的函數需要ros::Duration並返回tf::TimeCache(這稱爲「最令人頭痛的解析」)。

如果你永遠不會嘗試使用odometryCache,第二個不會導致任何問題。
如果你這樣做(例如,odometryCache.clearList()),編譯器會抱怨你試圖訪問非聚合類型的成員,或者沿着這些行。

如果你不嘗試命名構造函數的參數:

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

它將編譯,但是鏈接會失敗,就像第一個作品。

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

+0

對不起,但你的選項都沒有編譯,而我的代碼的這個版本正在編譯 – YeahScience

+0

正如在另一個答案中所說,問題是在ROS的鏈接,所以你的答案也是正確的 – YeahScience

相關問題