C++ C++;模板和静态成员-标题中的定义

C++ C++;模板和静态成员-标题中的定义,c++,templates,static-members,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. TSing

考虑以下构造:

//! 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;
/!模板单身汉。
/*!
强制执行单例行为的模板包装器。
*/
模板
青格尔顿级
{
私人:
//!单例实例指针。
静态T*实例;
//!私有构造函数。
钦格尔顿(){}
//!私有空副本构造函数。
TSingleton(const TSingleton&sourceObject){}
公众:
//!静态单例实例获取程序。
静态T*GetInstance()
{
如果(实例==0)
实例=新的T();
返回实例;
}
};
模板T*TSingleton::instance=0;
这个模板类和静态实例的定义写在同一个头文件中。对于非模板类,由于为实例静态成员定义了多个符号,这会导致链接时间错误。对于模板来说,这种情况似乎也很直观,因此必须将定义分开并将其放入.cpp文件中。但模板通常在类似头文件的文件中声明和定义是什么使此语法对模板类有效并起作用?


这里有一个链接,但它没有对模板类的情况提供明确的解释。

这是有效的,因为
[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)的模板专用化,前提是每个定义出现在不同的翻译单元中,并且定义满足以下要求

这些需求相当长,所以我不会在这里重复它们,但本质上它们声明每个重复的定义必须相同(否则程序具有未定义的行为)