我要做一个自定义的链表功能,现在定义了链表节点如下:
template<typename T> class ChainNode
{
public:
ChainNode() content(NULL) {};
ChainNode(const ChainNode<T>& toCopy) : content( new T(*toCopy.content)) {}
ChainNode(ChainNode<T>&& toMove) : content(toMove.content) {toMove.content = NULL;}
ChainNode(const T& input) : content(new T(input)) {};
~ChainNode() {if(content != NULL) delete content;};
protected:
T* content; //用于生成动态内存
};
但是想了想觉得在ChainNode<T>::content
这个变量有点无意义,每次生成都需要拷贝输入,如果用作模板的类型拷贝成本很高就会很被动。至于拷贝构造和右值拷贝这些都是一样的,无论用什么方式新建ChainNode<T>
都会比直接新建T
多一次拷贝,以一个Point
类型为例:
//! 用作节点的模板
class Point{
public:
Point(double x, double y, double z);
double X,Y,Z;
};
//! 直接定义Point
Point test(1.1,2.2,3.3);
//! 定义ChainNode<Point>
ChainNode<Point> testNode(Point(1.1,2.2,3.3)); //多出比直接定义Point多出一次临时变量的拷贝
想问的问题是,有没有可能通过继承的方式,让类模板ChainNode<T>
可以直接使用template T
的构造函数:
//! 在链表里插入一个新的节点
...
ChainNode<Point> newNode(1.1,2.2,3.3);
...
为了实现这个目的,我在把ChainNode<T>
的定义调整为:
template<typename T> class ChainNode : public T
{
public:
ChainNode() {};
ChainNode(const ChainNode<T>& toCopy) : T(toCpoy) {}
ChainNode(ChainNode<T>&& toMove) : T(toCopy) {}
ChainNode(const T& input) : T(input) {};
~ChainNode() {};
protected:
T* content = static_cast<T*>(this);
};
ChainNode<int> intNode; //报错C2516
ChainNode<Point> pointNode(1.1,2.2,3.3); //报错无对应构造函数
现在就卡在这一步:
double
,int
等,可以成功通过编译;如果使用double
,int
等类型,则会报出_C2516:是非法基类_的编译错误;希望各位专家帮忙指点一二。