考虑以下构造:
//! 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;
这个模板类和静态实例的定义写在同一个头文件中。对于非模板类,由于为实例静态成员定义了多个符号,这会导致链接时错误。模板也会发生这种情况似乎很直观,因此必须将定义分开并将其放入 .cpp 文件中。但是模板通常在头文件中声明和定义。是什么让这种语法对模板类有效且有效?
有一个关于此的维基百科链接,但它没有明确解释在模板类的情况下会发生什么。