带有模板基类的静态成员定义
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;
如果您希望为像CSub1
、CSub2
这样的实体类显式定义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
}
相关文章:
- 如何在C++中定义静态成员结构
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 在类定义中推导内联静态成员函数的返回类型
- 如何声明和定义具有推导类型的静态成员
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 类模板静态数据成员定义/声明/初始化
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- thread_local静态成员模板定义:初始化失败,GCC
- 对类的静态成员的未定义引用
- C++ dll 定义静态成员
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 如何从具有专用化的类模板定义静态成员变量?
- 为什么静态成员函数定义不能有关键字"static"?
- 定义非静态成员时获取C++中的"this"类型
- 声明和定义类静态成员变量不会导致多重声明,这是为什么?
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 具有静态模板类成员的模板类:如何定义静态成员
- C 不能将带有父类指针作为类型的静态模板成员定义引用
- 模板超类的静态成员定义
- 带有模板基类的静态成员定义