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;
}