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

时间:2012-08-31 11:09:04

标签: 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;

此模板类和静态实例的定义写在同一个头文件中。对于非模板类,由于为实例静态成员定义了多个符号,因此会导致链接时错误。对于模板来说,这似乎是直观的,因此必须将定义分开并将其放在.cpp文件中。但模板通常在类似头文件中声明和定义。 是什么允许此语法对模板类有效且有效?

有一个wikipedia链接,但它没有提供关于模板类的情况的明确解释。

1 个答案:

答案 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)只要每个定义出现在不同的翻译单元中,并且定义满足以下要求。 ...

要求非常冗长,所以我不会在这里复制它们,但实质上它们声明每个重复的定义必须相同(否则程序有不确定的行为)。