只需要把
template <class T>
struct Isptr<T *>
{
enum{result=true};
};
改成
template <class T>
struct Isptr<T *>
{
enum{result=true};
typedef T baseType;
};
分配内存的那一段
template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new (*T)[33];//这里可以这么解决么??
//这里我知道用局部特化解决当T为char*的情况,,不过他只能是唯一的,
//char*局部特化解决为 Array=(char **)new char*[size]; for(){*Array[i]=new char[size]}
//要是我传入的不是char*,而是其他类型的指针呢,只能一个一个特化,失去了模板意思
//因此我想用针对信息特化,不过我就不知道这里应该怎么解决分配空间问题。
}
}
}
改成
template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new Isptr<T>::baseType[33];
}
}
}
由于我的firefox不能发附件,下面把test.h的内容都贴出来了,
#include <iostream>
using namespace std;
const int size=8;
template <class T>
struct Isptr
{
enum{result=false};
};
template <class T>
struct Isptr<T *>
{
enum{result=true};
typedef T baseType;
};
template <class T>
class test
{
protected:
T *Array;
public:
test();
~test();
void display()const;
void clean_up();
};
template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new Isptr<T>::baseType[33];
}
}
}
template <class T>
void test<T>::clean_up()
{
if(Isptr<T>::result)
{
for(int i=0;i<size;i++)
delete []Array[i];
}
}
template <class T>
test<T>::~test()
{
clean_up();
delete []Array;
}
template <class T>
void test<T>::display()const
{
cout<<Array;
}