.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
し、スタンドアロンオブジェクトファイルとしてリンクするのではなく、単にすべてを含めるための唯一の合理的な解決策はありますか?それはひどく醜いようです!その場合、以前の状態に戻り、名前stack.cpp
を変更してstack.hpp
それで終了することもできます。