C++ 为指针专门化模板类

C++ 为指针专门化模板类,c++,templates,specialization,C++,Templates,Specialization,我有一个模板类,如下所示: template <typename T> class PacketMember { public: PacketMember(const std::size_t maxMemberSize, const QString memberName) : m_maxMemberSize(maxMemberSize), m_memberName(memberName) { } void appen

我有一个模板类,如下所示:

template <typename T>
class PacketMember
{
public:
    PacketMember(const std::size_t maxMemberSize, const QString memberName) :
        m_maxMemberSize(maxMemberSize),
        m_memberName(memberName)
    {

    }

    void append(const T data, const std::size_t length)
    {
        if(currentMemberSize() + length <= m_maxMemberSize)
        {
            for(std::size_t i = 0 ; i < length ; ++i) {
                m_data = data;
                m_member.push_back(m_data);
            }
        }
    }

    QString memberName() const
    {
        return m_memberName;
    }

    std::size_t currentMemberSize() const
    {
        return m_member.size();
    }

    std::size_t maxMemberSize() const
    {
        return m_maxMemberSize;
    }

    std::vector<T>* member() const
    {
        return m_member;
    }

    void setMaxMemberSize(const std::size_t newSize) {
        m_maxMemberSize = newSize;
    }

private:
    T m_data;
    std::vector<T> m_member;
    std::size_t m_maxMemberSize;
    QString m_memberName;
};
template <typename T>
class PacketMember<T*>
{
public:
    PacketMember(const std::size_t maxMemberSize, const QString memberName) :
        m_maxMemberSize(maxMemberSize),
        m_memberName(memberName)
    {

    }

    void append(T* data, const std::size_t length)
    {
        if(currentMemberSize() + length <= m_maxMemberSize)
        {
            for(std::size_t i = 0 ; i < length ; ++i) {
                m_data = new T(*data);
                m_member.push_back(m_data);
            }
        }
    }

    QString memberName() const
    {
        return m_memberName;
    }

    std::size_t currentMemberSize() const
    {
        return m_member.size();
    }

    std::size_t maxMemberSize() const
    {
        return m_maxMemberSize;
    }

    std::vector<T*>* member() const
    {
        return &m_member;
    }

private:
    T* m_data;
    std::vector<T*> m_member;
    std::size_t m_maxMemberSize;
    QString m_memberName;
};
模板
类包成员
{
公众:
PacketMember(常数std::size\u t maxMemberSize,常数QString memberName):
m_maxMemberSize(maxMemberSize),
m_成员名称(成员名称)
{
}
无效附加(常量数据,常量标准::大小\u T长度)
{

如果(currentMemberSize()+length是什么让你认为你得到了一个
PacketMember
?我看到的一个错误是,
member()
函数返回一个指向该成员的指针,而你却返回了该成员本身。对于你最初的问题,这证明了没有“双指针”实例化:

#include <iostream>

template<typename T>
struct A {
    typedef T type;
};

template<typename T>
struct A<T*> {
    typedef T* pointertype;
};


static_assert(std::is_same<A<int>::type,int>::value,"Non-pointer: Not the same type");
static_assert(std::is_same<A<int*>::pointertype,int*>::value,"Pointer: Not the same type");

int main()
{
    return 0;
}

如果没有相同的类型,分配将不起作用(尝试从强制转换中添加/删除
*
).x++;y++;
只是为了消除编译器对未使用变量的警告。

你能发布你的实现吗?@Samer实现什么?如果你指的是类成员函数,那么它是一个模板,所有内容都在头文件中。你如何实例化你的类对象?如果你看我描述的底部,我已经dy提到了它,但我再次这样做,比如说
PacketMember p(1,“header”);
。你怎么知道你得到了
PacketMember
?请发布你收到的原始错误消息。我没有使用与C++11兼容的编译器。你能编辑答案以便用旧的编译器编译吗?@MoKi
\include…assert(typeid((A::type))==typeid(int));assert((typeid(A::type))==typeid(int*))
。哦,很抱歉,我以为我遇到了问题,因为我的IDE(QtCreator)不是编译器。当我键入函数名时,它向我显示我试图使用
char**
类型访问我的模板实例,由于代码不完整且不可编译,以及我缺乏使用模板的经验,我认为我做错了什么。现在我已经测试了我的代码,结果不是这样使用
char**
type进行实例化。这可能是QtCreator中的一个错误。我应该删除这个问题吗?@MoKi很高兴知道即使是您的旧编译器也没有以这种基本方式损坏;-)。@Oguk抱歉!我想现在我有一个错误要向Qt社区报告。
#include <iostream>

template<typename T>
struct A {
    typedef T type;
};

template<typename T>
struct A<T*> {
    typedef T* pointertype;
};


int main()
{
    A<int>::type x = (int)0;
    A<int*>::pointertype y = (int*)0;
    x++;
    y++;
    return 0;
}