[英]Pointer template specialization
我是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*>
{
...
};
您正在混合两个不同的概念:继承和模板专门化。
您的课程不是模板专长,而是从模板实例化派生的 。 但是,无法实例化该模板,因为当T = char *
语句Value = buffer[offset];
具有类型不匹配错误。
如果要编写模板专门化,则语法为
template<>
class ProductTableItem<char *> {
...
};
请注意,从继承的角度来看,两个模板实例化通常是不相关的类型...
可能是您尝试做的事情的解决方案,例如
// Non-template base class
class ProducTableItemBase {
protected:
...
public:
virtual bool LoadFromBuffer(const BYTE* buffer, int count) = 0;
};
// Template class for all other types
template<typename T>
class ProductTableItem : public ProductTableItemBase {
T Value;
bool LoadFromBuffer(const BYTE* buffer, int count) {
...
}
};
// Template specialization for char*
template<>
class ProductTableItem<char *> : public ProductTableItemBase {
char * Value;
bool LoadFromBuffer(const BYTE* buffer, int count) {
...
}
};
我说的可能是因为确实不清楚我要完成什么。
您会混淆继承和专业化的概念。 首先,为了使模板专业化,您不必从中派生模板-您可以使用以下语法:
template <>
class TProductTableItem<char*>
{...}
下一个困惑是您试图在专业化中使用非专业的成员变量。 模板专业与非专业版完全分开。 对于此示例,您仅在非专用模板内声明了变量Offset
, DataLength
和Value
。 如果要在此处将它们添加到专业化中:
template <>
class TProductTableItem<char*>
{
int Offset;
int DataLength;
char* Value;
...
}
您希望您的memcpy行更像这样:
memcpy(Value, (void*)&buffer[Offset], DataLength);
同样,当您分配值时:
Value = (T)&buffer[Offset];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.