問題タブ [explicit-instantiation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
427 参照

c++ - テンプレートのインスタンス化を共有ライブラリからポータブルにエクスポートするにはどうすればよいですか

私はこのヘッダーを持っています:

この実装では:

そしてこの消費者:

および次の CMakeLists.txt:

MSVC または GCC でビルドして実行すると、期待どおりの出力が得られます。

ただし、mylib.cpp でテンプレートの特殊化を有効にすると、GCC でビルド エラーが発生します。

そしてMSVCで:

そしてclangで:

共有ライブラリからテンプレートのインスタンス化 (テンプレートの一部のテンプレートの特殊化を含む可能性があります) を dllexport するための正しく移植可能な方法は何ですか?

0 投票する
1 に答える
737 参照

c++ - clang による明示的な C++ テンプレートのインスタンス化

注:いくつかの関連する質問 (たとえば、この質問) は、この質問の重複としてマークされました。私はこの特定の質問を認識しており、対応する回答の解決策に従います。ただし、コンパイラが異なれば動作も異なり、その理由はわかりません。

私のライブラリはクラス テンプレートを備えており、ライブラリ内の特定のテンプレート引数のインスタンスを提供したいと考えています。これは、テンプレートがかなりのコンパイル時間を必要とするためです。クラス テンプレートは次のようになります ( stack.hpp)

その実装は対応するstack.tppファイルに存在します

特定のテンプレート引数のみをサポートしたいのでstack.cpp、次の明示的なテンプレート インスタンスを作成します。

これは g++ および clang++ でコンパイルされますが、結果の共有ライブラリのシンボルには違いがあります。

対。

私のアプリケーションでは、そのような明示的にインスタンス化されたクラスのコンストラクターは、clang++ では見つかりませんが、g++ では問題なく動作します。この基本的な MWE が理由を示していると思います。clang++ を使用してクラス テンプレートのコンストラクター シンボルを取得する方法を誰か教えてもらえますか?