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

时间:2011-07-27 08:43:10

标签: c++ templates static-members derived-class

有一个基类:

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

3 个答案:

答案 0 :(得分:5)

template<>
CSomeClass TBase<CSub1>::m_objSomeClass;
template<>
CSomeClass TBase<CSub2>::m_objSomeClass;
如果您希望明确为staticCSub1等固定类定义CSub2成员,则

是正确的方法之一。 Demo

编辑:传统方式是定义为:

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

这两种方式都可以达到目的。

答案 1 :(得分:2)

  

还有一些子类都有自己的静态   成员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
}

答案 2 :(得分:0)

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
}