繁体   English   中英

指针模板专业化

[英]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*>
{...}

下一个困惑是您试图在专业化中使用非专业的成员变量。 模板专业与非专业版完全分开。 对于此示例,您仅在非专用模板内声明了变量OffsetDataLengthValue 如果要在此处将它们添加到专业化中:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM