我是 C++ 模板的新手,所以这是我的问题。
我有一个通用类 ProductItem,它可以完成我想要的所有事情,但我需要专门化一个部分才能使用指针(用于 char*)。
我的代码:
typedef unsigned char BYTE;
template<typename T>
class TProductTableItem
{
protected:
int Offset;
int DataLength;
T Value;
public:
virtual bool LoadFromBuffer(const BYTE* buffer, int count)
{
if(Offset + DataLength > count)
return false;
Value = buffer[Offset];
return true;
}
};
// Specialization (doesn't compile)
class TProductTableItemString : public TProductTableItem<char*>
{
bool LoadFromBuffer(const BYTE* buffer, int count)
{
if(Offset + DataLength > count)
return false;
memset(Value, 0, DataLength);
memcpy(Value, (void*)&buffer[Offset], DataLength);
return true;
}
};
尝试编译此代码时,出现以下错误消息:
cannot convert from 'const BYTE' to 'char*'
我做错了什么?
看起来即使对于 char*
类型,它也会尝试使用 TProductTableItem::LoadFromBuffer
函数而不是 TProductTableItemString::LoadFromBuffer
一个。
谢谢。
最佳答案
TProductTableItemString
,通过继承它,导致 TProductTableItem<char*>
的实例化.在执行TProductTableItem::LoadFromBuffer
,这一行:
Value = buffer[Offset];
无法编译,因为 buffer[Offset] 是一个字节,而 Value 是一个 char*。
顺便说一下,TProductTableItemString
不是特化,它只是继承然后隐藏LoadFromBuffer
.如果你真的想专攻,你应该写:
template<>
class TProductTableItem<char*>
{
...
};
关于c++ - 指针模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786886/