[解決済み] ヘッダーで定義された関数やクラスをテンプレート化して実装する場合、なぜ "tpp "ファイルを使用するのですか?
質問内容
の最初の回答をご参照ください。 テンプレートの実装に関する質問です。
具体的には、次の引用に注目してください。
これに対する一般的な解決策は、ヘッダーファイルでテンプレート宣言を書き、実装ファイルでクラスを実装することです( 例えば、.tpp ) を作成し、この実装ファイルをヘッダの末尾にインクルードします。
一番気になる部分を太字にしました。
.tppファイルの存在意義は?そのページで提案されていることをそのままやってみたところ、うまくいきました。しかし、その後、ファイルの拡張子を適当な意味不明なもの(.zzや.yppなど)に変えても、まだ動作しました 動作するようになっているのでしょうか?.tppや他の拡張子は関係ないのでしょうか?また、なぜ.cppではダメなのでしょうか?
ここでもうひとつ、迷っていることがあります。
私の実装が.cppで書かれていて、ヘッダーで非テンプレート関数が定義されている場合、.cppファイルを一回だけコンパイルする必要がありますよね? 少なくとも.cppファイルの何かを変更するまでは。
しかし、テンプレート化された関数を定義するヘッダーがあり、私の実装がランダムでファンキーな拡張子を持つファイルにある場合、それはどのようにコンパイルされるのでしょうか?そして、実装はコンパイルされるのでしょうか?
あらゆる
をコンパイルするとき、どのようなソースコードであっても
#include
のヘッダーは?
解決方法は?
<ブロッククオート.tppなどの拡張子は関係ないのでしょうか?また、.cppではダメなのでしょうか?
拡張子は問わないが、その際に
.cpp
というのは、慣習に反するからです(それでも動作はしますが、やめましょう。
.cpp
ファイルは一般的にソースファイルです)。 それ以外は、あなたのコードベースが何を使っているかという問題です。 例えば、私(とBoostコードベース)は以下のように使っています。
.ipp
を使用します。
.tppファイルの存在意義は?
あるモジュールのインターフェイスを含むファイルに、血なまぐさい実装の詳細をすべて記載したくない場合に使用します。 しかし、実装を
.cpp
ファイルはテンプレートだからです。 そこで、できる限りのことをするわけです(明示的なインスタンス化などは考慮しない)。 例えば
Something.hpp
#pragma once
namespace space {
template <typename Type>
class Something {
public:
void some_interface();
};
} // namespace space
#include "Something.ipp"
Something.ipp
#pragma once
namespace space {
template <typename Type>
void Something<Type>::some_interface() {
// the implementation
}
} // namespace space
ヘッダーに定義、別ファイルに実装を書くのは、コンパイル時間を短縮するためで、実装を変更するまでは一度だけコンパイルすればよいと思っていました。
一般的なテンプレートコードを実装ファイルに分割することはできません。 テンプレートを使用するためには、全コードを表示する必要があります。 詳しくは、以下を参照してください。 なぜテンプレートはヘッダーファイルでしか実装できないのですか?
<ブロッククオートしかし、実装ファイルに何かおかしな拡張子がついていた場合、コンパイルの面ではどうなのでしょうか?実装がcppにある場合と同じように効率的なのでしょうか?
をコンパイルしないんですね。
.tpp
,
.ipp
,
-inl.h
などのファイルです。 これらは、他のヘッダーファイルによってのみインクルードされることを除けば、ヘッダーファイルと同じです。 コンパイルするのはソースだけです (
.cpp
,
.cc
) ファイルを作成します。
関連
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] なぜこのプログラムは3つのC++コンパイラで誤って拒否されるのですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】std::unique_ptr<T>はTの完全な定義を知るために必要なのでしょうか?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?