C++ 状态错误C2440:“ '=';:无法从';常数FDHNode<;项目类型>*';至';FDHNode<;项目类型>*'&引用;?

C++ 状态错误C2440:“ '=';:无法从';常数FDHNode<;项目类型>*';至';FDHNode<;项目类型>*'&引用;?,c++,C++,我一直收到错误“C2440:”=':无法从“const FDHNode*”转换为“FDHNode*”,我一辈子也无法解决它。这是我的代码和定义函数,问题显然来自于此 template<class ItemType> class FDHNode { private: ItemType coeff; //Data item representing coefficient ItemType expon; //Data item representing exponen

我一直收到错误“C2440:”=':无法从“const FDHNode*”转换为“FDHNode*”,我一辈子也无法解决它。这是我的代码和定义函数,问题显然来自于此

template<class ItemType>
class FDHNode
{
  private:
    ItemType coeff; //Data item representing coefficient
    ItemType expon; //Data item representing exponent
    FDHNode<ItemType>* next; //Pointer to a next node 
  public:
    FDHNode();
    FDHNode(const ItemType& coeffi, const ItemType& expone);
    FDHNode(const ItemType& coeffi, FDHNode<ItemType>* nextNodePtr);
    void setCoeffi(const ItemType& aCoeffi);
    void setExpon(const ItemType& anExpon);
    void setNext(const FDHNode<ItemType>* NEXTPTR);
    ItemType getCoeffi();
    ItemType getExpon();
    FDHNode<ItemType>* getNext();

    void print();


 };

template<class ItemType>
void FDHNode<ItemType>::setNext(const FDHNode<ItemType>* NEXTPTR)
{
    next = NEXTPTR;
}
模板
类FDHNode
{
私人:
ItemType coeff;//表示系数的数据项
ItemType expon;//表示指数的数据项
FDHNode*next;//指向下一个节点的指针
公众:
FDHNode();
FDHNode(const ItemType&coeffi、const ItemType&expone);
FDHNode(const ItemType&coeffi,FDHNode*nextNodePtr);
void setCoeffi(const ItemType&aCoeffi);
void setExpon(const ItemType&anExpon);
void setNext(常数FDHNode*NEXTPTR);
ItemType getCoeffi();
ItemType getExpon();
FDHNode*getNext();
作废打印();
};
模板
void FDHNode::setNext(常量FDHNode*NEXTPTR)
{
next=NEXTPTR;
}

变量
next
的定义如下:

FDHNode<ItemType>* next; //Pointer to a next node
const FDHNode<ItemType>* NEXTPTR
添加的
const
有其意义,说明它不能修改。当您将
NEXTPTR
分配给
next
时,它会成为一个问题,因为
next
可以修改,但
NEXTPTR
是一个常量

根据某些情况,有两种方法可以解决这一问题:

  • 如果
    next
    指针实际上是可以更改的,则必须修改
    NEXTPTR
    的定义,使其不是
    const
    。如果这样做,您的函数声明将如下所示:
    void FDHNode::setNext(FDHNode*NEXTPTR)
  • 或者参数实际上是一个常量,在这种情况下,您应该将
    next
    变量也定义为
    const
    。例如:
    const FDHNode*next;

  • 注意:有一个
    const\u cast
    可以去掉变量的
    const
    。但是如果您不知道这个问题的答案,您不太可能需要在这里进行该cast,因为在这种情况下,它可能弊大于利。

    变量
    下一个
    定义如下:

    FDHNode<ItemType>* next; //Pointer to a next node
    
    const FDHNode<ItemType>* NEXTPTR
    
    添加的
    const
    有其意义,说明它不能修改。当您将
    NEXTPTR
    分配给
    next
    时,它会成为一个问题,因为
    next
    可以修改,但
    NEXTPTR
    是一个常量

    根据某些情况,有两种方法可以解决这一问题:

  • 如果
    next
    指针实际上是可以更改的,则必须修改
    NEXTPTR
    的定义,使其不是
    const
    。如果这样做,您的函数声明将如下所示:
    void FDHNode::setNext(FDHNode*NEXTPTR)
  • 或者参数实际上是一个常量,在这种情况下,您应该将
    next
    变量也定义为
    const
    。例如:
    const FDHNode*next;

  • 注意:这里有一个可以去掉变量的常量的
    const\u cast
    。但是如果你不知道这个问题的答案,你不太可能需要这个cast,因为在这种情况下它可能弊大于利。

    错误中说得很清楚,
    NEXTPTR
    const FDHNode*
    while
    next
    FDHNode*
    ,您不能将
    const FDHNode*
    分配给
    FDHNode*

    您可以使用
    const\u cast
    使其成为
    非const
    ,例如:

    FDHNode<ItemType>* non_const_next = const_cast<FDHNode<ItemType>*>(NEXTPTR);
    
    FDHNode*non_const_next=const_cast(NEXTPTR);
    

    最好的方法是更改
    setNext()
    的参数,将其更改为
    FDHNode*NEXTPTR

    错误很明显,
    NEXTPTR
    const FDHNode*
    next
    FDHNode*
    ,您不能将
    const FDHNode*
    分配给
    FDHNode*

    您可以使用
    const\u cast
    使其成为
    非const
    ,例如:

    FDHNode<ItemType>* non_const_next = const_cast<FDHNode<ItemType>*>(NEXTPTR);
    
    FDHNode*non_const_next=const_cast(NEXTPTR);
    

    最好的方法是更改
    setNext()的参数
    ,将其更改为
    FDHNode*NEXTPTR

    您有一个常量指针,并希望将其分配给一个非常量指针。这不起作用,因为它允许您以后修改常量。您建议我如何解决此问题?我正在尝试为一个节点类定义一个函数,以便它指向下一个节点。@bopersson您有一个常量指针吗I’我想将其分配给一个非常量指针。这不起作用,因为它允许您以后修改常量。您建议我如何解决这个问题?我正在尝试为一个节点类定义一个函数,以便它指向下一个节点。@Bopersson非常感谢!您的第一个建议解决方案是使它不是常量,效果很好。@Francishroux我很高兴它奏效了,我更重要的是希望你理解这个问题。我做到了,当你指出它时,很明显我在自相矛盾。非常感谢!你的第一个建议解决方案是让它不那么完美。@FrancisHeroux我很高兴它奏效了,我更重要的是希望你理解这个问题m、 是的,很明显,一旦你指出,我是在自相矛盾。