определение статического члена с базовым классом шаблона - PullRequest
3 голосов
/ 27 июля 2011

Есть базовый класс:

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;

Есть предложения? Спасибо, Мирко

Ответы [ 3 ]

5 голосов
/ 27 июля 2011
template<>
CSomeClass TBase<CSub1>::m_objSomeClass;
template<>
CSomeClass TBase<CSub2>::m_objSomeClass;

- это один из правильных способов, если вы хотите явно указать элемент static, определенный для твердого класса, такого как CSub1, CSub2. Демо .

Редактировать : Общепринятым способом является определение:

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

Оба способа будут служить цели.

2 голосов
/ 27 июля 2011

И есть некоторые подклассы, которые все должны иметь свои статические член 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
}
0 голосов
/ 27 июля 2011

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
}
...