図1: 関数テンプレート
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
これはを使用する正しい方法ですかextern template
、またはこのキーワードを図2のようにクラステンプレートにのみ使用しますか?
図2:クラステンプレート
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
これらすべてを1つのヘッダーファイルに入れるのは良いことですが、複数のファイルで同じパラメーターを使用してテンプレートをインスタンス化すると、同じ定義が複数得られ、コンパイラーはそれらをすべて(1つを除く)削除してエラーを回避します。どうやって使うのextern template
?クラスだけに使用できますか、それとも関数にも使用できますか?
また、図1と図2は、テンプレートが単一のヘッダーファイルにあるソリューションに拡張できます。その場合、extern template
複数の同じインスタンス化を回避するためにキーワードを使用する必要があります。これはクラスまたは関数のみに適用されますか?
extern template class foo<int>();
間違いのようです。
()
、外部行の近くに「予期される非修飾ID」と表示されています。あなたの本とビジュアルスタジオの両方が間違っています。g++やclangなどのより標準に準拠したコンパイラを使用してみてください。