使用类的非模板版本作为父级

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】:

您需要为类和类模板赋予不同的名称或将它们放入不同的命名空间:类和类模板不能具有完全相同的名称。

【讨论】:

以上是关于使用类的非模板版本作为父级的主要内容,如果未能解决你的问题,请参考以下文章

C++20:非类型模板参数中的非捕获 lambda

从嵌套类的函数访问父级的非静态成员

DLL-导出模板基类的静态成员

c++ 使用友好类的类型作为模板参数声明 stl 向量

联合作为模板化基类的部分特化

模板……基础知识笔记