有一个基类:
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
答案 0 :(得分:5)
template<>
CSomeClass TBase<CSub1>::m_objSomeClass;
template<>
CSomeClass TBase<CSub2>::m_objSomeClass;
如果您希望明确为static
,CSub1
等固定类定义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
}