带有模板基类的静态成员定义

static member definition with template base class

本文关键字:静态成员 定义 基类      更新时间:2023-10-16

有一个基类:

template<class T_CLASS>
class TBase
{
  protected:
    static CSomeClass m_objSomeClass;
  public:
    inline void Set(CSomeClass f_objSomeClass) { m_objSomeClass = f_objSomeClass; }
};

还有一些子类,它们都应该有自己的静态成员m_objSomeClass。我试图通过对基类进行模板化来实现这一点。

class CSub1 : public TBase<CSub1>
{
   //...
};
class CSub2 : public TBase<CSub2>
{
  //...
};

这个定义是什么样子的?这可能吗?我试了一些。。。但都不起作用:

template<class T_CLASS>
CSomeClass TBase<T_CLASS>::m_objSomeClass;
//In fact the next one worked in Visual Studio; 
// but not in with the armcc where I need it.
CSomeClass TBase<CSub1>::m_objSomeClass;
CSomeClass TBase<CSub2>::m_objSomeClass;

有什么建议吗?谢谢Mirco

template<>
CSomeClass TBase<CSub1>::m_objSomeClass;
template<>
CSomeClass TBase<CSub2>::m_objSomeClass;

如果您希望为像CSub1CSub2这样的实体类显式定义static成员,则是正确的方法之一。演示。

编辑:传统的方法是定义为:

template<class T_CLASS>
CSomeClass TBase<T_CLASS>::m_objSomeClass;

这两种方式都符合目的。

还有一些子类,它们都有自己的静态成员m_objSomeClass。我试图通过对基类进行模板化来实现这一点。

如果你只想实现单独的静态成员,你不需要子类,你只需要从TBase实例化,它们就会有单独的静态会员,因为从模板生成的每个模板类都有自己的任何静态变量或成员的副本,请参阅下面的例子(这个例子用VS2008和gcc编译得很好(:

struct CSomeClass {
    CSomeClass(int i):m_i(i){}
    int m_i;
};
template<class T_CLASS>
class TBase
{
  protected:
    static CSomeClass m_objSomeClass;
  public:
    inline void Set(CSomeClass f_objSomeClass) { m_objSomeClass = f_objSomeClass; }
};
class CSub1
{
};
class CSub2
{
};
template<class T_CLASS>
CSomeClass TBase<T_CLASS>::m_objSomeClass = CSomeClass(0);
int main()
{
    TBase<CSub1> tb1;
    TBase<CSub2> tb2;
    //tb1 and tb2 have separate static member after instantiated from tempalte class TBase
    tb1.Set(CSomeClass(1)); //tb1::m_objSomeClass now is 1
    tb2.Set(CSomeClass(2)); //tb2::m_objSomeClass now is 2
}

Mirco,因为你真的需要一个子类,我修改了我的例子,所以你有了子类,你有了单独的静态成员函数,见下面(这个例子用VS2008和gcc编译得很好(:

struct CSomeClass {
    CSomeClass(int i):m_i(i){}
    int m_i;
};
template<class T_CLASS>
class TBase
{
  protected:
    static CSomeClass m_objSomeClass;
  public:
    inline void Set(CSomeClass f_objSomeClass) { m_objSomeClass = f_objSomeClass; }
};
class CSub1 : public TBase<CSub1>
{
};
class CSub2 : public TBase<CSub2>
{
};
template<class T_CLASS>
CSomeClass TBase<T_CLASS>::m_objSomeClass = CSomeClass(0);
int main()
{
    TBase<CSub1> tb1;
    TBase<CSub2> tb2;
    //tb1 and tb2 have separate static member after instantiated from tempalte class TBase
    tb1.Set(CSomeClass(1)); //tb1::m_objSomeClass now is 1
    tb2.Set(CSomeClass(2)); //tb2::m_objSomeClass now is 2
}