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

时间:2014-08-14 08:09:56

标签: c++ templates

我正在尝试为不同的数据类型设置模板类:

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是   与声明不相容

我做错了什么?根据我的所有资料来源,我的语法对于部分成员专业化是正确的。

感谢您的帮助。

2 个答案:

答案 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不同,它可能不是匹配。

查看实例:http://ideone.com/ZH4v6x