使用const引用的init成员数据

时间:2015-02-23 00:23:32

标签: c++ templates

我想创建一个基本类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代表值)相同的两个错误)

我的代码有什么问题,我该如何解决?

1 个答案:

答案 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>