我正在尝试创建一个适用于不同数据类型的模板类:
template <typename TDataType>
class CBaseProperty : public CBasePropertyBase
现在这个类有一个针对像这样的数组的特殊化:
template <typename TDataType, u32 TSize>
class CBaseProperty<TDataType[TSize]> : public CBasePropertyBase
现在我想为字符串编写一个特定成员函数的专门版本:
template <> b8 CBaseProperty<string>::setValue(const void* _pVal)
当我尝试为字符串数组的部分特化指定这个成员时:
template <u32 _TSize> b8 CBaseProperty<string[TSize]>::setValue(const void* _pVal)
我遇到了3个错误:
错误1: 错误 C3860:在类模板名称后列出的模板参数列表必须按照模板参数列表中使用的顺序列出参数。 错误2: 错误 C2995:
b8 CBaseProperty<TDataType>::setValue(const void*)
:函数模板已经被定义过。
错误3: 错误 C3855:CBaseProperty<TDataType>
:模板参数TDataType
与声明不兼容。我究竟做错了什么?根据我的所有资料,我部分成员特化的语法是正确的。
感谢任何帮助。
typedef unsigned int u32;
而我的字符串是一个 std::string。 - Thomas B.typedef
类型,特别是当它们有着众所周知的名称时。此外,名称u32
已经内置了这样一个假设,即该类型将是32位宽度,而对于unsigned int
并不保证如此。标准库实际上提供了具有这种保证、广为人知且跨平台的类型。你要找的是std::uint32_t
。最后,如果你选择一个类型来表示某个东西的大小,你应该始终选择std::size_t
。 - Robert Allan Hennigan Leahy