図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などのより標準に準拠したコンパイラを使用してみてください。