考虑以下构造:
//! 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文件中。但模板通常在类似头文件中声明和定义。 是什么允许此语法对模板类有效且有效?
有一个wikipedia链接,但它没有提供关于模板类的情况的明确解释。
答案 0 :(得分:13)
这是有效的,因为[basic.def.odr]/5
明确允许复制模板:
类类型(第9章),枚举类型(7.2),带内部链接的内联函数(7.1.2),类模板(第14章),非静态函数模板(14.5)可以有多个定义.6),类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或模板特化,程序中未指定某些模板参数(14.7,14.5.5)只要每个定义出现在不同的翻译单元中,并且定义满足以下要求。 ...
要求非常冗长,所以我不会在这里复制它们,但实质上它们声明每个重复的定义必须相同(否则程序有不确定的行为)。