[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
2022-03-14 09:41:32
質問
引用元 C++標準ライブラリ:チュートリアルとハンドブック :
現時点では、テンプレートを使用する唯一の移植可能な方法は、インライン関数を使用してヘッダーファイルで実装することです。
これはなぜでしょうか?
(明確化:ヘッダーファイルは のみ ポータブルなソリューションです。しかし、最も便利なポータブルソリューションです)。
どのように解決するのですか?
注意:それは ではない この回答の最後にある別の解決策を参照してください。
とにかく、あなたのコードが失敗する理由は、テンプレートをインスタンス化するとき、コンパイラは与えられたテンプレート引数で新しいクラスを作成することです。例えば
template<typename T>
struct Foo
{
T bar;
void doSomething(T param) {/* do stuff using T */}
};
// somewhere in a .cpp
Foo<int> f;
この行を読むと、コンパイラは新しいクラス(仮に
FooInt
)と同等である。
struct FooInt
{
int bar;
void doSomething(int param) {/* do stuff using int */}
}
そのため,コンパイラはメソッドの実装にアクセスし,テンプレートの引数 (この場合は
int
). もしこれらの実装がヘッダーになければ、アクセスできないので、コンパイラーはテンプレートのインスタンス化をすることができません。
この問題を解決する一般的な方法は、テンプレートの宣言をヘッダーファイルに記述し、クラスを実装ファイル(例えば.tpp)で実装し、この実装ファイルをヘッダーの末尾にインクルードすることです。
Foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};
#include "Foo.tpp"
Foo.tpp
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}
この方法では、実装は宣言から分離されたままですが、コンパイラからアクセス可能な状態になっています。
代替案
もう一つの解決策は、実装を分離しておき、必要なテンプレートのインスタンスを明示的にすべてインスタンス化することです。
Foo.h
// no implementation
template <typename T> struct Foo { ... };
Foo.cpp
// implementation of Foo's methods
// explicit instantiations
template class Foo<int>;
template class Foo<float>;
// You will only be able to use Foo with int or float
私の説明ではよくわからないという方は この件に関するC++スーパーFAQ .
関連
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] 無名/匿名の名前空間と静的関数の比較
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C++のSTLはなぜテンプレートに大きく依存しているのですか?(そして*インターフェイス*にはない)
-
[解決済み] なぜC++のインライン関数はヘッダーにあるのですか?
-
[解決済み】古典的なソートアルゴリズムを最新のC++で実装する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] テンプレートクラスのコンストラクタの「未定義参照」【重複】について