当我试图利用pimpl-idiom和智能指针来实现我自己的特定于平台的GUI组件的包装器时,我遇到了一个我无法解决的问题。问题可能出在pimpl-idiom和*unique_ptr*上,因为我不知道还会出什么问题。所有错误似乎都是链接错误。在使用代码时,我得到了各种未定义的引用错误(链接如下):http://www.cplusplus.com/forum/general/96020/
以下是错误列表:
> 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 `GetStockObject@4'|
> 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 ===|我该如何克服这个问题呢?
发布于 2013-03-18 00:28:40
这个问题与PIMPL的习惯用法没有任何关系,也与您使用std::unique_ptr<>的事实无关。
相反,您的代码似乎没有#include PointerSmartSafe.inl文件,该文件包含PointerSmartSafe<>类模板的所有成员函数的定义。
因此,当遇到对这些函数的调用时,编译器将无法隐式实例化这些函数,并且这些函数也不会在PointerSmartSafe.inl中实例化(仅定义)。
因此,链接器会抱怨找不到这些符号。如果您需要更多详细信息,您可能会发现this Q&A on StackOverflow非常有用。
要解决此问题,请添加:
#include "PointerSmartSafe.hpp"指令,并让当前#include PointerSmartSafe.hpp头的所有转换单元#include PointerSmartSafe.inl文件。
或者,如果您想使此操作更简单,只需将PointerSmartSafe.inl的内容移到PointerSmartSafe.hpp的末尾,此时您甚至可以删除PointerSmartSafe.inl文件。
https://stackoverflow.com/questions/15463107
复制相似问题