使用类的非模板化版本作为父级
Use non-templated version of class as parent
本文关键字:版本 更新时间:2023-10-16
我正在将一个项目从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
不幸的是,没有办法做到这一点。我认为标准的相关部分是:
类模板不得与任何其他模板具有相同的名称,类、函数、对象、枚举、枚举器、命名空间或类型在相同的范围内(3.3),除了(14.5.4)中的规定。除了函数模板可以通过(非模板)重载具有相同名称的函数或由具有相同名称(14.8.3),在命名空间范围或中声明的模板名称类范围在该范围中应是唯一的。
然而,应该接受每种类型的DataBuffer
的方法也可以成为模板,这样就不需要从公共基继承了。
正如错误所说,类模板不能与非模板同名。
您将不得不重命名基类或模板。
您需要为类和类模板指定不同的名称,或者将它们放入不同的名称空间:类和类样板不能有完全相同的名称。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 从预处理器获取 Windows 版本(C++ Win32)
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何在C++中将 Python 字符串转换为其转义版本?
- Qt版本应该在其他计算机上运行吗?