簡體   English   中英

帶有模板基類的靜態成員定義

[英]static member definition with template base 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

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

如果你想明確地為像CSub1CSub2這樣的實體類定義static成員,那么這是正確的方法CSub2 演示

編輯 :傳統方式是定義為:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM