2013-03-17 62 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