使用类的非模板版本作为父级
Posted
技术标签:
【中文标题】使用类的非模板版本作为父级【英文标题】:Use non-templated version of class as parent 【发布时间】:2013-12-16 17:12:46 【问题描述】:我正在将一个项目从 C# 移植到 C++,并且在使用模板时遇到问题,我需要一个类的非模板版本和模板版本,其中一个为另一个,即:
class DataBuffer // Holds generic databuffer functions (getting size in bytes etc)
public:
int32 getVal() return 10;
;
template <typename T>
class DataBuffer<T> : public DataBuffer // Able to retrieve data as a type...
public:
int32 getSizeOfT() return sizeof(T);
;
我的方法可以接受任何类型的 DataBuffer 作为参数,因此无法对整个类进行模板化,有没有办法在不重命名基类的情况下做到这一点?
任何帮助将不胜感激。
编辑: 此代码无法编译,并在编译时抛出以下错误:
error C2989: 'DataBuffer' : class template has already been declared as a non-class template
【问题讨论】:
您不能创建多个具有相同名称的类。 【参考方案1】:不幸的是,没有办法这样做。我认为标准的相关部分是:
类模板不得与任何其他模板同名, 类、函数、对象、枚举、枚举器、命名空间或类型 在相同的范围 (3.3) 中,除了 (14.5.4) 中的规定。除了那个 函数模板可以通过(非模板)重载 具有相同名称的函数或具有 同名(14.8.3),在命名空间范围内声明的模板名称或 类范围在该范围内应该是唯一的。
但是,应该接受每种类型的 DataBuffer
的方法也可以制作为模板,这样就不需要从公共基础继承。
【讨论】:
我决定将数据缓冲区类修改为只有模板化的方法,这样我就可以继续使用我的函数/方法。感谢您的帮助。【参考方案2】:正如错误所说,类模板不能与非模板同名。
您必须重命名基类或模板。
【讨论】:
【参考方案3】:您需要为类和类模板赋予不同的名称或将它们放入不同的命名空间:类和类模板不能具有完全相同的名称。
【讨论】:
以上是关于使用类的非模板版本作为父级的主要内容,如果未能解决你的问题,请参考以下文章