2013-03-17 101 views
1

當我試圖利用pimpl-idiom和智能指針來實現我自己的包裝平臺特定的GUI組件時,我遇到了一個我無法解決的問題。問題可能是pimpl-idiom和* unique_ptr *,因爲我不知道還有什麼可能是錯誤的。所有的錯誤似乎都是鏈接錯誤。我得到了各種各樣的未定義引用錯誤,同時使用的代碼(下面的鏈接): http://www.cplusplus.com/forum/general/96020/C++ 11 - 可能pimpl-idiom和unique_ptr的困境?

這是錯誤的清單:

> obj\debug_windows\helixirrwidgets\src\helixirrwidgets\Window-windows.o||In 
> function `Window':| 
> E:\new2\projects\programming\test2\test2\..\..\helixirrwidgets\src\helixirrwidgets\Window.hpp|15|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> 
> >::PointerSmartSafe(HelixirrWidgets::Window::Helper*)'| E:\new2\projects\programming\test2\test2\..\..\helixirrwidgets\src\helixirrwidgets\Window.hpp|15|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> 
> >::PointerSmartSafe(HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> > const&)'| 
> obj\debug_windows\helixirrwidgets\src\helixirrwidgets\Window-windows.o||In 
> function `Window':| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|88|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> 
> >::PointerSmartSafe(HelixirrWidgets::Window::Helper*)'| E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|91|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> 
> >::PointerSmartSafe(HelixirrWidgets::Window::Helper*)'| obj\debug_windows\helixirrwidgets\src\helixirrwidgets\Window-windows.o||In 
> function `ZN15HelixirrWidgets6Window12save_changesEv':| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|98|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|100|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|101|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|106|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|107|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|109|undefined 
> reference to `[email protected]'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|111|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|112|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|114|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|118|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|119|undefined 
> reference to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const'| 
> obj\debug_windows\helixirrwidgets\src\helixirrwidgets\Window-windows.o:E:\new2\projects\programming\helixirrwidgets\src\helixirrwidgets\Window-windows.cpp|120|more 
> undefined references to 
> `HelixirrWidgets::PointerSmartSafe<HelixirrWidgets::Window::Helper, 
> std::default_delete<HelixirrWidgets::Window::Helper> >::operator->() 
> const' follow| ||=== Build finished: 16 errors, 0 warnings ===| 

我怎樣才能解決這個問題?

回答

2

該問題與PIMPL成語沒有任何關係,也沒有與您使用std::unique_ptr<>的事實有關。

相反,看起來您的代碼並不是#includePointerSmartSafe.inl文件,其中包含PointerSmartSafe<>類模板的所有成員函數的定義。

因此,當遇到對它們的調用時,編譯器將無法隱式地實例化這些函數,並且這些函數在PointerSmartSafe.inl(僅限定義)中都沒有實例化。

因此,鏈接器會抱怨找不到那些符號。如果你需要更多的細節,你可能會發現this Q&A on StackOverflow相當豐富。


要解決該問題,添加:在PointerSmartSafe.inl開始

#include "PointerSmartSafe.hpp" 

指令,並讓所有的翻譯單位目前#includePointerSmartSafe.hpp#includePointerSmartSafe.inl文件,而不是。

或者,如果您想簡化一下,只需將PointerSmartSafe.inl的內容移到PointerSmartSafe.hpp的末尾,此時您甚至可以刪除PointerSmartSafe.inl文件。

+0

非常感謝你,安迪!問題解決了。有趣的是,這樣一個小小的錯誤會導致如此多的頭痛!你的名字將被放入源代碼中以幫助我。上帝祝福你。 – Helixirr 2013-03-17 16:36:19

+0

@Helixirr:不客氣,對你的項目感到高興和幫助;)(你可以把我的名字留出,不用擔心:D) – 2013-03-17 16:37:54

+0

我很開心,當你在。 :) – Helixirr 2013-03-17 16:42:10