我正在尝试为不同的数据类型提供一个模板类:
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
为 与声明不符
我做错了什么?根据我的所有来源,我的语法对于部分成员专业化是正确的。
感谢您的任何帮助。
您只能通过提供所有模板参数来专门化单个成员函数(您将长度保留为参数(,这将迫使您在此处指定数组长度。
因此,如果您需要字符串数组的专用版本,将长度保留为参数,则需要首先对字符串数组的类模板进行专用化。
据我了解您的帖子,解决方案可以简化为以下最小示例:
template<class T>
class foo
{
public:
void tell() { cout << "generaln"; }
void base() { cout << "ok"; }
};
template<class T, std::size_t N>
class foo<T[N]>
{
public:
void tell() { cout << "special arraysn"; }
};
template<std::size_t N>
class foo<std::string[N]>
{
public:
void tell() { cout << "special string arraysn"; }
};
template<>
void foo<std::string>::tell()
{
cout << "stringn";
}
int main()
{
foo<std::string[2]> f;
f.tell();
return 0;
}
输出:
特殊字符串数组
template <u32 _TSize> b8 CBaseProperty<string[TSize]>::setValue(const void* _pVal)
当字符串是 std::string 的别名时,这不是有效的代码,因为 std::string 的长度是可变的,因此您可以在编译时专门研究其长度
template <typename TDataType, u32 TSize>
class CBaseProperty<TDataType[TSize]> : public CBasePropertyBase
这可能有效,但存在风险,因为 std::size_t 的类型是实现定义的,因此如果您的 u32 类型(您在评论中说是无符号的 int(与 std::size_t 不同,它可能不匹配。
查看实时示例:http://ideone.com/ZH4v6x