テンプレート化された C クラスを .hpp/.cpp ファイルに分割することは可能ですか?
問題:
テンプレート化された C クラスを .hpp に分割しようとしていますおよび .cpp ファイルでは、コンストラクターとデストラクターへの未定義の参照が原因でコンパイル エラーが発生しますシンボル。
main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'
コード:
stack.hpp
#ifndef _STACK_HPP #define _STACK_HPP template <typename Type> class stack { public: stack(); ~stack(); }; #endif
st ack.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 ファイルに実装してコンパイルすることは現実的ではありません。コンパイラはテンプレート クラスのメモリ レイアウトとメソッド定義を生成するときにデータ型の知識を必要とするため、実装は .hpp ファイルに含める必要があります。 .cpp ファイルを個別にコンパイルしようとすると、次の問題が発生します。
代替案解決策:
実装の詳細を非表示にするには、データ構造とアルゴリズムを分離することを検討してください。テンプレート化されたクラスを作成してデータ構造を表現し、テンプレート化されていないクラスはアルゴリズムを処理してデータ構造を利用します。これにより、テンプレート クラスに依存せずに、重要な実装の詳細を別のライブラリに隠すことができます。
以上がテンプレート化された C クラスを .hpp および .cpp ファイルに分割できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。