1

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 ===|

どうすればこの問題を克服できますか?

4

1 に答える 1

2

この問題は、PIMPL イディオムや、使用しているという事実とは何の関係もありませんstd::unique_ptr<>

むしろ、あなたのコードは、クラス テンプレートのすべてのメンバー関数の定義を含むファイルではないよう#includeです。PointerSmartSafe.inlPointerSmartSafe<>

したがって、コンパイラは、呼び出しが発生したときにこれらの関数を暗黙的にインスタンス化することができず、それらの関数はPointerSmartSafe.inlどちらでもインスタンス化されません (定義されているだけです)。

したがって、リンカはそれらのシンボルが見つからないと文句を言います。詳細が必要な場合は、StackOverflow に関するこの Q&A が非常に参考になります。


この問題を解決するには、次を追加します。

#include "PointerSmartSafe.hpp"

の先頭にディレクティブを追加し、現在ヘッダーになっているPointerSmartSafe.inlすべての翻訳単位を代わりにファイルにします。#includePointerSmartSafe.hpp#includePointerSmartSafe.inl

または、これを簡単にしたい場合は、 の内容をPointerSmartSafe.inlの末尾に移動するだけPointerSmartSafe.hppで、その時点でファイルを削除することもできPointerSmartSafe.inlます。

于 2013-03-17T16:28:40.230 に答える