次の構成を検討してください。
//! Templated singleton.
/*!
Template wrapper enforcing the singleton behavior.
*/
template <class T>
class TSingleton
{
private:
//! Singleton instance pointer.
static T* instance;
//! private constructor.
TSingleton() { }
//! private empty copy constructor.
TSingleton(const TSingleton<T>& sourceObject) {}
public:
//! Static singleton instance getter.
static T* GetInstance()
{
if (instance == 0)
instance = new T();
return instance;
}
};
template <class T> T* TSingleton<T>::instance = 0;
このテンプレート クラスと静的インスタンスの定義は、同じヘッダー ファイルに記述されます。非テンプレート クラスの場合、インスタンス static member に対して複数のシンボルが定義されているため、リンク時エラーが発生します。これがテンプレートでも発生するのは直感的に思えるため、定義を分離して .cpp ファイルに入れる必要があります。ただし、テンプレートは通常、ヘッダーのようなファイルで宣言および定義されます。この構文がテンプレート クラスに対して有効で機能することを可能にするのは何ですか?
これに関するウィキペディアのリンクがありますが、テンプレートクラスの場合に何が起こるかについて明確な説明はありません。