【问题标题】:C++ templates and static members - definition in the headerC++ 模板和静态成员 - 标题中的定义
【发布时间】:2012-08-26 04:46:19
【问题描述】:

考虑以下结构:

//! 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 链接,但它没有提供关于模板类的情况的明确解释。

【问题讨论】:

    标签: c++ templates static-members


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多