C++ 具有常量引用的Init成员数据

C++ 具有常量引用的Init成员数据,c++,templates,C++,Templates,我想创建一个基本类PElement。为了实现我的链表,我希望该对象PElement有一个指向下一个PElement的指针和一个指向值的指针,该值是T的一个实例 这是我写的: template<class T> class PElement { public: //Données membre PElement * s; T * v; //Constructeur PElement(

我想创建一个基本类
PElement
。为了实现我的链表,我希望该对象
PElement
有一个指向下一个
PElement
的指针和一个指向值的指针,该值是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){}

};
最后是我得到的错误:

error C2440: 'initializing' : cannot convert from 'const PElement<double> *' to 'PElement<double> *'

error C2439: 'PElement<double>::s' : member could not be initialized
错误C2440:“正在初始化”:无法从“const PElement*”转换为“PElement*”
错误C2439:“PElement::s”:无法初始化成员
(第二个参数v(v表示值)的两个错误相同)

我的代码有什么问题,如何修复?

您的构造函数:

//Constructeur
PElement( const PElement * suivant, const T *valeur)
    :s(suivant)
    ,v(valeur)
{}
尝试使用
suivant
初始化
s
PElement*
,即
const PElement*

<> > C++不允许。这样做是错误的,因为
constpelement*
意味着指向的对象是不可变的,而
PElement*
意味着指向的对象是可变的

您的初始化尝试丢失该不变性限定符。 您可以通过接受构造函数的非常量值立即修复它:

//Constructeur
PElement( PElement* suivant, T* valeur)
    :s(suivant)
    ,v(valeur)
{}
<>但是我们大多不在C++中制作自己的链表。相反,我们使用
std::list
std::list
当我们需要双打或字符串的链接列表时。

神圣过度使用
new
Batman!你以前用什么语言?如果我们知道,就越容易解释差异。是
Java
?你不能安全地将
const PElement*
分配给
PElement*
。是的,我开始用Java学习。好的,我想我明白了。谢谢你的解释,我们正在尝试在C++中创建一个图形的通用实现,这就是我们在课堂上用自己的手创造一切的原因。为了理解我们所做的事情,@ DurLayC++标准库不包含泛型图,但在Booost图形库中有一些免费的实现。
//Constructeur
PElement( PElement* suivant, T* valeur)
    :s(suivant)
    ,v(valeur)
{}