teo*_*ron 9 c++ templates static-members
考虑以下构造:
//! 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;
Run Code Online (Sandbox Code Playgroud)
此模板类和静态实例的定义写在同一个头文件中.对于非模板类,由于为实例静态成员定义了多个符号,因此会导致链接时错误.对于模板来说,这似乎是直观的,因此必须将定义分开并将其放在.cpp文件中.但模板通常在类似头文件中声明和定义.是什么允许此语法对模板类有效且有效?
有关于此的维基百科链接,但它没有提供关于模板类的情况的明确解释.
Man*_*rse 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)的模板特化,前提是每个模板定义出现在不同的翻译单元中,并且定义满足以下要求....
要求是相当漫长的,所以我不会在这里重复他们,但本质上,他们指出,每个重复定义必须是相同的(否则程序有未定义行为).