数组的部分模板成员专用化



我正在尝试为不同的数据类型提供一个模板类:

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

最新更新