質問: テンプレート化されたc ++クラスを.hpp / .cppファイルに分割することは可能ですか? .hppと.cppファイルに分割されているc++テンプレートクラスをコンパイルしようとするとエラーが発生します。$ g++ -c -o main.o main.cpp $ g++ -c -o stack.o stack.cpp $ g++ -o main main.o stack.o main.o: in function `main': main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()' collect2: ld returned 1 exit status make: *** [program] error 1 ここに私のコードがあります:stack.hpp:#ifndef _stack_hpp #define _stack_hpp template <typename type> class stack { public: stack(); ~stack(); }; #endif 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; } ldはもちろん正しいです。シンボルはstack.oにありません。 この質問 に対する答えは役に立たない、私が既に言っているように。 これ が役立つかもしれませんが、すべてのメソッドを.hppファイルに移動したくありません。.cppファイル内のすべてを.hppファイルに移動し、スタンドアロンオブジェクトファイルとしてリンクするのではなく、単にすべてを含める唯一の合理的なソリューションですか?それはawfullyseemsいようです!その場合は、以前の状態に戻り、stack.cppの名前をstack.hppに変更し、それで完了です。
回答: いいえ、できません。 exportキーワードがないわけではありません。これは、すべての意図と目的に対して実際には存在しません。できる最善の方法は、関数の実装を「.tcc」または「.tpp」ファイルに配置し、.hppファイルの最後に.tccファイルを#includeすることです。ただし、これは単なる外観です。ヘッダーファイルにすべてを実装するのと同じです。これは、単にテンプレートを使用するために支払う価格です。