我想创建一个基本类PElement<T>
。为了实现我的链表,我希望该对象PElement<T>
具有指向下一个PElement<T>
的指针和指向该值的指针,该值是T的实例。
这就是我写的:
template<class T>
class PElement {
public:
//Données membre
PElement * s;
T * v;
//Constructeur
PElement(
const PElement * suivant,
const T *valeur
):s(suivant),v(valeur){}
};
这就是我在main.cpp
文件中创建对象的方式:
//Test PElement<Double>
PElement<double> * l1;
double *a = new double(2);
double *b = new double(5);
double *c = new double(7.5);
double *d = new double(9);
l1 = new PElement<double>(new PElement<double>(new PElement<double>(new PElement<double>(NULL, d), c), b), a);
//Test PElement<String>
PElement<string> * l2;
string *e = new string("Carotte");
string *f = new string("Cerise");
string *g = new string("Orange");
l2 = new PElement<string>(new PElement<string>(new PElement<string>(NULL, g), f), e);
最后这是我得到的错误:
error C2440: 'initializing' : cannot convert from 'const PElement<double> *' to 'PElement<double> *'
error C2439: 'PElement<double>::s' : member could not be initialized
(和第二个参数v(v代表值)相同的两个错误)
我的代码有什么问题,我该如何解决?
答案 0 :(得分:2)
你的构造函数:
//Constructeur
PElement( const PElement * suivant, const T *valeur)
:s(suivant)
,v(valeur)
{}
尝试使用s
初始化PElement*
suivant
const PElement*
。
C ++不允许这样做。这样做是错误的,因为const PElement*
意味着指向对象是不可变的,但PElement*
意味着指向对象是可变的。
您的初始化尝试丢失该immutability限定符。 您可以通过接受构造函数的非const值立即修复它:
//Constructeur
PElement( PElement* suivant, T* valeur)
:s(suivant)
,v(valeur)
{}
但是我们大多数时候都不会在C ++中创建自己的链表。相反,我们使用
当我们需要双打或字符串的链接列表时,std::list<double>
或std::list<std::string>
。