問題タブ [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.
c++ - テンプレートを操作するときのコンパイル エラー "expected unqualified-id"
私のコードでは
コンパイル エラーが発生する
コンパイラは何を伝えたいのですか?
これらのエラーを修正するにはどうすればよいですか?
c++ - C++でMPLベクトルのすべてのメンバーのテンプレートを明示的にインスタンス化する方法は?
次のヘッダー ファイルを検討してください。
Foo::read
に含まれるすべての型のソース ファイルでメンバー関数テンプレートを明示的にインスタンス化する必要がありboost::mpl::vector
ます。
出来ますか?前もって感謝します、ダニエル。
編集
Foo::read<T>
私はいくつかの解決策を見つけました-変数が宣言されている構造体のコンストラクターにポインターを割り当てると、インスタンス化が発生するようです:
したがって、プロセスは次のように自動化できます。
しかし、このソリューションが移植可能で標準に準拠しているかどうかはわかりません。(Intel および GNU コンパイラで動作します。)
c++ - externテンプレートの使用方法
私はC++0xのN3291ワーキングドラフトを調べてきました。そして、私はexternテンプレートに興味がありました。セクション14.7.3は次のように述べています。
インライン関数とクラステンプレートの特殊化を除いて、明示的なインスタンス化宣言には、それらが参照するエンティティの暗黙的なインスタンス化を抑制する効果があります。
参考までに:「明示的なインスタンス化宣言」という用語は、標準的なものですextern template
。これはセクション14.7.2で定義されています。
extern template std::vector<int>
これは、を使用する場合、通常は暗黙的にインスタンス化されることを実行しても、そうしないと言っているように聞こえますstd::vector<int>
。
次の段落はもっと興味深いです:
エンティティが同じ翻訳単位内の明示的なインスタンス化宣言と明示的なインスタンス化定義の両方の対象である場合、定義は宣言に従うものとします。明示的なインスタンス化宣言の対象であり、翻訳単位で暗黙的なインスタンス化(14.7.1)を引き起こす方法でも使用されるエンティティは、プログラムのどこかで明示的なインスタンス化定義の対象となるものとします。それ以外の場合、プログラムは形式が正しくなく、診断は必要ありません。
参考までに:「明示的なインスタンス化の定義」という用語は、次のことを表す標準的な用語ですtemplate std::vector<int>
。つまり、なしextern
。
私にとって、これら2つのことは、extern template
暗黙的なインスタンス化を防ぐと言っていますが、明示的なインスタンス化を妨げるものではありません。したがって、これを行う場合:
2行目は、最初の行が暗黙的に発生するのを防いだことを明示的に実行することにより、最初の行を効果的に無効にします。
問題はこれです:VisualStudio2008は同意していないようです。私が使用したい方法extern template
は、ユーザーが特定の一般的に使用されるテンプレートを暗黙的にインスタンス化しないようにすることです。これにより、.cppファイルで明示的にインスタンス化して、コンパイル時間を短縮できます。テンプレートは一度だけインスタンス化されます。
問題は、VS2008では基本的にそれらの周りに#ifdefを設定する必要があることです。単一の翻訳ユニットがバージョンextern
と非extern
バージョンを認識した場合、extern
バージョンが勝ち、誰もそれをインスタンス化しないためです。そして、リンカーエラーが発生します。
だから、私の質問は次のとおりです。
- C ++ 0xによる正しい動作は何ですか?
extern template
明示的なインスタンス化を防ぐ必要がありますか? - 前の質問に対する答えがそうではないということである場合、VS2008はエラーです(当然のことながら、仕様よりもかなり前に記述されているため、彼らのせいではありません)。VS2010はこれをどのように処理しますか?正しい
extern template
動作を実装していますか?
visual-studio-2010 - ネストされたクラス、dllexportおよびVS2010
次のコードを作成しましょう。
それで:
- DLLにエクスポートするクラスがあります。
- このクラスには、DLLにエクスポートするサブクラスもあります。
- タイプの変数('x ...')があり
template <subclass>
ます。 - メンバー変数もdllエクスポートする必要があります。
- したがって、
template <subclass>
このタイプを使用する前に、明示的にインスタンス化する必要があります。 - ただし、インスタンス化はグローバルスコープでのみ実行できるため、これは不可能です。
ただし、グローバルスコープでは、サブクラスは(まだ)定義されていません。
template <class::subclass>
クラス本体の後のインスタンス化は効果がありません。
では、警告やエラーを回避するために、この問題を正しく処理するにはどうすればよいでしょうか。
ところで:クラス内のテンプレートのインスタンス化はVS2008でうまく機能しました。
前もって感謝します。
LuP
c++ - 次のテンプレート関数の意味は?
上記のコードをレガシーコードで見ましたが、その意味がわかりません。これは、通常の特殊化されていない関数定義でも、完全に特殊化された関数定義でもありません。
何か案が?
c++ - 明示的にインスタンス化されたテンプレートの動的な使用
重複の可能性:
テンプレート関数の動的ディスパッチ?
非型テンプレートを使用して、ヒープに動的に割り当てられたメモリを使用せずに、異なるメモリフットプリントのグリッドセルを作成したいと思います。
セルサイズの数には限りがあるため(約10)、それらすべてを明示的に簡単にインスタンス化できます。ただし、どのセルが必要かは、コンパイル時ではなく、実行時のみにわかります。
テンプレートがコンパイル時の概念であることは知っていますが、特に必要なすべてのセルタイプが明示的にインスタンス化されることを保証できるため、この方法でテンプレートクラスを使用する方法はありますか?
c++ - 静的テンプレートライブラリに関するリンク/コンパイル時間
テンプレートベースのクラス(STLおよびブースト)にソースファイルを使用せず、実装をヘッダーに配置することも一般的な慣習のようです。これにより、ヘッダーとソースファイルでの宣言と実装の従来の分離と比較して、ヘッダーを含むソースファイルのコンパイルにかかる時間が大幅に増えると思います。これが行われる理由は、おそらく、ソースファイルでコンパイラに使用するテンプレートを指示する必要があるためです。これにより、.aファイルが肥大化する可能性があります。
ライブラリが大きくなるにつれてリンカーもより多くの時間を必要とすると仮定すると、ライブラリヘッダーを含むソースファイルのコンパイルにかかる時間の観点から、どちらのアプローチがより高速になりますか?
1. .cppファイルを使用せず、実装を含むクラス全体をヘッダーに配置します
また
2.ライブラリ自体のソースファイル内でさまざまなタイプのテンプレートを明示的にコンパイルします
c++ - テンプレートの明示的なインスタンス化をいつ使用しますか?
テンプレートの明示的なインスタンス化について読んでいます:
template struct MyStruct<long>;
「かなり珍しい」と表現されていたのですが、どのような状況で役立つのでしょうか?
c++ - どのようにテンプレート化を強制的に基本クラスに一致させますか?
Base
クラス用に明示的にインスタンス化されているが、クラス用にはインスタンス化されていないテンプレート関数がありますDerived
。Derived
クラス(または他の派生クラス)を渡す使用をクラスと一致させるにはどうすればよいBase
ですか?
ヘッダーファイル:
実装ファイル:
Derived
またはの関数を明示的にインスタンス化していないため、未定義の参照を取得しますが、明示的に定義されているクラスDerived2
に対してバインドしたいと思います。Base
C ++-03を使用してBaseから派生したすべてのオブジェクトについて、テンプレートを強制的にBaseクラスに解決するにはどうすればよいですか?
Derived
クラスをBase
クラス定義に特化して、どうにかしてそれを行うことはできますか?
c++ - テンプレートクラスのテンプレート化されたコンストラクターの明示的なインスタンス化
Clang3.2のバグなのかC++03の違反なのかはわかりませんが、テンプレートクラスのテンプレートコンストラクターの明示的なインスタンス化は失敗するようですが、テンプレートクラスのテンプレート化されたメンバー関数の明示的なインスタンス化は成功します。
たとえば、以下はclang++とg++の両方で問題なくコンパイルされます。
一方、以下はg ++では警告なしにコンパイルされますが、clang++では失敗します。
特に、次の形式の2つのエラーメッセージが表示されます。
これは標準の違反ですか、それともclang ++のバグですか?