テンプレート化された C クラスを .hpp/.cpp ファイルに分割する
問題:
コンパイルC テンプレート クラスが .hpp ファイルと .cpp ファイルに分割されると、未定義の参照エラーが発生しますテンプレートメンバー用関数.
コード:
stack.hpp:
template <typename Type> class stack { public: stack(); ~stack(); };
stack.cpp:
#include <iostream> #include "stack.hpp" template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl; } template <typename Type> stack<Type>::~stack() { std::cerr << "Goodbye, stack " << this << "." << std::endl; }
main.cpp:
#include "stack.hpp" int main() { stack<int> s; return 0; }
答え:
説明:
それテンプレート化されたクラスの実装を個別の .cpp ファイルに分割してコンパイルすることは現実的ではありません。ヘッダー ファイルは前処理されるだけで、実際のコードは含まれません。
コンパイル プロセス:
コンパイル時に、前処理されたヘッダー コードは .cpp ファイルと結合されます。ただし、テンプレート クラスの場合、コンパイラはメモリ レイアウトとメソッド定義を生成するためにテンプレート データ型に関する情報を必要とします。
個別の cpp ファイルの問題:
メソッドの移動ヘッダー ファイルでテンプレート クラスをインスタンス化せずに別の cpp ファイルに定義しても、必要なオブジェクト ファイル情報は生成されません。したがって、リンカーはシンボルを見つけることができず、未定義の参照エラーが発生します。
代替アプローチ:
インターフェイスを実装から分離するには、データ構造をアルゴリズムから分離することを検討してください。テンプレート クラスはデータ構造のみを表す必要があります。アルゴリズムは、テンプレート クラスと対話したり、テンプレート クラスを利用したりする、テンプレート化されていない個別のクラス ライブラリに実装できます。このアプローチにより、貴重な実装の詳細を隠すことができます。
以上がテンプレート化された C クラス実装を .hpp および .cpp ファイルに分割すると、未定義の参照が取得されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。