我正在尝试为不同的数据类型设置模板类:
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:类模板后面的模板参数列表 name必须按照模板参数列表中使用的顺序列出参数
错误2错误C2995:
b8 CBaseProperty<TDataType>::setValue(const void*)
:功能模板已定义错误3错误C3855:
CBaseProperty<TDataType>
:模板参数TDataType
是 与声明不相容
我做错了什么?根据我的所有资料来源,我的语法对于部分成员专业化是正确的。
感谢您的帮助。
答案 0 :(得分:2)
您只能通过提供所有模板参数(您将长度作为参数)来专门化单个成员函数,它会强制您在此指定数组长度。
因此,如果你需要一个专门用于字符串数组的版本,将长度作为参数,你需要首先对字符串数组进行类模板的特化。
据我了解你的帖子,解决方案可以简化为以下最小例子:
template<class T>
class foo
{
public:
void tell() { cout << "general\n"; }
void base() { cout << "ok"; }
};
template<class T, std::size_t N>
class foo<T[N]>
{
public:
void tell() { cout << "special arrays\n"; }
};
template<std::size_t N>
class foo<std::string[N]>
{
public:
void tell() { cout << "special string arrays\n"; }
};
template<>
void foo<std::string>::tell()
{
cout << "string\n";
}
int main()
{
foo<std::string[2]> f;
f.tell();
return 0;
}
<强>输出:强>
特殊字符串数组
答案 1 :(得分:0)
template <u32 _TSize> b8 CBaseProperty<string[TSize]>::setValue(const void* _pVal)
当string是std :: string的别名时,这不是有效的代码,因为std :: string的长度是可变的,所以你可以在编译时专注于它的长度
template <typename TDataType, u32 TSize>
class CBaseProperty<TDataType[TSize]> : public CBasePropertyBase
这可能有效,但风险很大,因为什么类型的std :: size_t是实现定义的,所以如果你的u32的类型(你在评论中说的是unsigned int)与std :: size_t不同,它可能不是匹配。