テンプレートクラスをで宣言するとA
しますa.h
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
そして、で印刷メソッドを定義しますa.cpp
(との明示的なインスタレーションを使用しtrue
てfalse
)
#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
のメインメインプログラムの例は次のmain.cpp
とおりです。
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
上記の小さなプロジェクトは問題なくコンパイルされます。
質問:メソッドの定義print
(内a.cpp
)の上に明示的なインスタンス化を配置すると、コードはコンパイルされなくなり、通常のundefined reference to A<true>::print(...)
エラーが発生します。
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
なぜそうなのですか?
編集:コンパイルするMakefile
main : main.o a.o
g++ main.o a.o -o main
main.o : main.cpp
g++ -c main.cpp
a.o : a.cpp
g++ -c a.cpp