Microsoft には、テンプレートのインスタンス化が外部になることを宣言できる拡張機能があります。したがって、暗黙的にインスタンス化されることはありません。少なくともそれが理論です。それをコードで再現してみました
#include <vector>
class Foo{
int i;
public:
virtual ~Foo();
};
extern template class std::vector<Foo>;
これは私に与えます
warning C4231: nonstandard extension used : 'extern' before template
explicit instantiation
ただし、他には何も起こらないようです。push_back を使用しているにもかかわらず、プログラムは find のリンクを続行します (そして、push_back がインスタンス化されたことを dumpbin が示しています)。
宣言したときだけ
extern template void std::vector<Foo>::push_back(const Foo&);
予想どおりリンカー エラーが発生します。
では、インスタンス化全体 (すべてのメンバー) を明示的に宣言して、暗黙的なインスタンス化を防ぐにはどうすればよいでしょうか?