状态错误C2440:“'=':无法从'const FDHNode <itemtype> *'转换为'FDHNode <itemtype> *'”?

时间:2017-04-04 22:40:24

标签: c++

我一直收到错误“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;
}

2 个答案:

答案 0 :(得分:2)

变量next的定义如下:

FDHNode<ItemType>* next; //Pointer to a next node

变量NEXTPTR的定义如下:

const FDHNode<ItemType>* NEXTPTR

添加的const有其重要性,声明无法修改。当您将NEXTPTR分配给next时,会出现问题,因为next可以修改,但NEXTPTR是常量。

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

  1. 如果next指针实际上可以更改,则必须修改NEXTPTR的定义,使其不是const。如果您这样做,您的函数声明将如此:void FDHNode<ItemType>::setNext(FDHNode<ItemType>* NEXTPTR)
  2. 或者参数确实是常量,在这种情况下,您应该将next变量定义为const。像这样:const FDHNode<ItemType>* next;
  3. 注意:有const_cast<>可能会丢弃变量的const - ness。但如果你不知道这个问题的答案,那么你不太可能需要这样的演员,因为在这种情况下它可能弊大于利。

答案 1 :(得分:1)

错误说明NEXTPTR const FDHNode<ItemType>*nextFDHNode<ItemType>*const FDHNode<ItemType>*,您无法将FDHNode<ItemType>*分配给const_cast }。

您可以使用non-const将其设为FDHNode<ItemType>* non_const_next = const_cast<FDHNode<ItemType>*>(NEXTPTR); ,例如:

setNext()

最好的方法是更改​​FDHNode<ItemType>* NEXTPTR的参数,将其更改为import itertools infGenGiven = itertools.count() # This is similar your generator def func(x): if x%2==0: return 1.5 else: return -1.5 infGenCycle = itertools.imap(func, infGenGiven) count=0 while count<10: print infGenCycle.next() count+=1