問題タブ [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 に答える
190 参照

c++ - 関数の明示的なインスタンス化

型に対して関数テンプレートの明示的なインスタンス化を使用するのはなぜですか? 関数の明示的なインスタンス化を使用しない場合、必要な関数を作成するためにテンプレートが使用されますが、明示的なインスタンス化の使用は何ですか?

上記の例では。明示的なインスタンス化は char 型に対して行われます。これの用途は何ですか?? コンパイラがテンプレートを使用して char 型の fn を作成できる場合。

私のコンセプトを明確にするのに役立つ参考文献がある場合は、それらを含めてください。

0 投票する
0 に答える
1132 参照

c++ - DLL のテンプレート クラスでのリンカー エラー (未解決のシンボル)

DLL (Visual Studio 2008 コンパイラ) から (特殊化された) テンプレート クラスを使用すると、リンカー エラー - 未解決のシンボル - が発生します。ここ Stackoverflow でも説明されている「明示的なテンプレートのインスタンス化」トリックを使用しようとしましたが、うまくいきませんでした。私はそれを非常に単純な再現可能な例に分解しました:

次の内容のヘッダー ファイル「MyTemplates.h」(およびこのヘッダー ファイルを単に含むコードを含まないソース ファイル「MyTemplates.cpp」) を含むダイナミック ライブラリ (DLL) 「MyTemplates.lib」があります。

これで、ファイル「Util.h」と「Util.cpp」を含む別の動的ライブラリ「UserLibary」(「MyTemplates.lib」にリンク) ができました。ファイル「Util.h」は次のとおりです。

ファイル「Util.cpp」の内容は次のとおりです。

問題は、ライブラリ 'UserLibrary' が正常にコンパイルされることですが、次のように 2 つのリンカー エラーが発生します。

そのため、リンカは、クラスA<int>およびのデフォルト コンストラクタのシンボルを見つけることができませんB<int>。なぜこれが可能で、どうすればこれらのリンカ エラーを取り除くことができますか? クラスの明示的なテンプレートのインスタンス化A<int>B<int>(ファイル 'MyTemplates.h' 内) がこれを解決すると思っていましたが、残念ながらそれは役に立たないようです - または間違った方法で使用していますか? 私のコンパイラは Visual Studio 2008、オペレーティング システムは Windows 7 64 ビット、コードは 64 ビットでコンパイルされています。

0 投票する
0 に答える
229 参照

java - Spring Bean フィールド (明示的にインスタンス化される) が null に割り当てられることがある

ある日、NPE が原因でアプリケーションがクラッシュし始めるというインシデントに直面しました。クラッシュしている場所を見つけましたが、なぜクラッシュしたのかわかりません。

大まかに言えば、春の豆と同時に現れるクラスAがあると仮定しましょう。このクラスには、明示的にインスタンス化されるフィールドプロパティ(はい、どのように聞こえるかは知っています) と、このフィールドを使用するメソッドpropertyUserがあります。

そして、通常の作業をしばらく行った後、プロパティ フィールドが null になり、propertyUserメソッドから NPE が発生しました。このレガシー コードを変更した結果、このプロパティはいずれかのスプリング コンテナーを介して割り当てられるようになりましたが、これがこのエラーの原因であったことを確認する必要があります。

ですので、どなたかヒントを頂ければ幸いです。

0 投票する
3 に答える
176 参照

c++ - クラス テンプレートの動的インスタンス化は、明示的または暗黙的と見なされますか?

クラス テンプレートがあり、特殊なインスタンスの動的に割り当てられたインスタンスへのスマート ポインターを使用する場合、クラス テンプレート全体がコンパイラーによって定義されますか、それともメンバー関数がポインターから呼び出されるのを待ちますか?インスタンス化される前ですか?

  1. クラス テンプレート全体が mark1 でインスタンス化されますか?

  2. そうでない場合、このコードは正しくコンパイルされ、メンバー関数 Test::nothing() はインスタンス化されないということですか?

0 投票する
2 に答える
1663 参照

c++ - コンパイルとテンプレートの明示的なインスタンス化を分離する

まとめ
この質問は、単一のテンプレート クラスのインスタンス化を複数の異なる翻訳単位で個別にコンパイルすることに関するものです。

質問
非テンプレート クラスの場合、定義をいくつかの .cpp ファイルに入れ、それらを個別にコンパイルできます。例えば:

ファイルああ:

ファイル A1.cpp:

ファイル A2.cpp:

今、私はテンプレートクラスで似たようなことをしようとしました. 必要なインスタンスが正確にわかっているので、テンプレートを明示的にインスタンス化しています。メンバー関数にはかなり大きな数式が含まれているため、各インスタンス化を個別にコンパイルしています。これにより、最適化レベルが高いとコンパイラが大幅に遅くなる可能性があります。だから私は次のことを試しました:

ファイル TA.h:

ファイル TA1.cpp:

ファイル TA2.cpp:

Linux では clang と GCC で動作しますが、Mac での GCC では重複シンボル エラー中のリンク中に失敗します (この例では、TA1.cpp と TA2.cpp の両方でインスタンス化された func3 が原因です)。

次に、標準で次の文に出くわしました。

C++ 11.14.7、パラグラフ 5:
与えられたテンプレートと与えられた一連のテンプレート引数について、
-- 明示的なインスタンス化の定義は、プログラム内で多くても 1 回しか現れない
-- ...

明示的なインスタンス化を使用している場合でも、テンプレート クラスの個別のコンパイルができない (許可されていない) ということですか (暗黙的なインスタンス化では明らかに不可能です)。

PS私は答えを得たので気にしませんが、ここで答えられると思う人は誰でもhttps://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-ヘッダファイルが間違っています。

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

c++ - gcc でのテンプレートの明示的なインスタンス化 (定義と宣言)

次のようなコードがあるとします。

ここでCLASS_KEY1CLASS_KEY2PREFIXはマクロです。CLASS_KEY1、またはキーワードにCLASS_KEY2拡張できます。空の文字セットまたはキーワードに展開できます。classstructunionPREFIXextern

マクロ値のすべての組み合わせ (コンパイラ gcc-4.8.1、オプション)について、そのようなコードがいつコンパイルされるか ( Yes- コンパイルされる、No- コンパイルされない)を示す表を次に示します。-std=c++11

これは gcc のバグですか、それとも標準要件ですか (奇妙なケースには疑問符が付いています)。他のコンパイラはどうですか?

0 投票する
3 に答える
1343 参照

c++ - 「extern」を使用しないテンプレート クラスの定義/インスタンス化の分離

(それほど新しくはない) C++11 標準では、externテンプレートのキーワードが導入されました。その目的は、使用時にテンプレートをインスタンス化するべきではなく、別の翻訳単位でインスタンス化することをコンパイラに伝えることです(したがって、リンク時にインスタンス化が利用可能になります)-少なくともAFAIK。

現在、C++11 より前の時代でも、コンパイルを高速化するために、テンプレート クラスの宣言/定義をそのインスタンス化から分離するために、次のようなものを使用していました。

point.h : クラス定義

point.cpp : メソッド定義

point_2d.cpp : クラスのインスタンス化 (2D バージョン)

point_3d.cpp : クラスのインスタンス化 (3D バージョン)

main.cpp : 2D および 3D ポイントの使用

今私は疑問に思っています:

  • 私たちのアプローチは有効な C++ (03 または 11) コードですか?それともうまくいったのは幸運でしょうか?
  • point.cppC++11 では、 inを含めてmain.cpp宣言することで同じことを実現できextern template <int dim> struct Point;ますか?