#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
私はA
a.h
で
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
テンプレートクラスを宣言し、(true
とfalse
の明示的なinstatiationで)a.cpp
に印刷する方法を定義します言うんmain.cpp
の主なメインプログラムの例は、
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
上記の小さなプロジェクトはうまくコンパイルされます。
質問:私は(a.cpp
中)print
メソッドの定義上記の明示的なインスタンス化を入れた場合、コードは通常の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
もVS2012で動作します。 – billz
私はして、Dejanが述べたように注文を変更しました – billz
@jogojapan - +1。 clang32とgcc48でコンパイルしたという私のコメントを削除しました。私が最初にテストしたように、3つのファイルの内容を1つのファイルにカットアンドペーストした場合、どのコンパイラでも問題なくコンパイルできました。 DejanがMakefileを投稿した後、私はあらゆるバージョンのclangとgccでエラーを再現できました。 –