“对类型的非常量左值引用不能绑定”带引用的错误(类型&)但不带指针(类型*)

时间:2013-02-07 15:08:26

标签: c++ pointers reference const lvalue

我收到此错误“类型为'Cell'的非常量值不能使用此代码绑定到'Cell *'类型的临时值:

class RegionHolder
{    
public:
    RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
    ~RegionHolder();

protected:
    Cell & m_RegionCellNOO; // difference is here   
};

但不是这个:

class RegionHolder
{    
public:
    RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
    ~RegionHolder();

protected:
    Cell * m_RegionCellNOO; // difference is here   
};

我不明白这个问题,并且真的想使用引用而不是指针。

由于

2 个答案:

答案 0 :(得分:6)

您忘了向我们展示定义,但可能Region1.m_NOOCell类型的对象。您的第一个示例是获取它的地址,并尝试使用结果指针初始化引用。引用不是从指针初始化,而是从对象本身初始化:

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
//                                            ^ no &         ^^ don't forget that

使用引用而不是指针有一个警告:它们不可分配,因此你的类也不是。通常这不是问题;但是如果你确实需要你的类是可分配的,那么你需要使用指针。

答案 1 :(得分:1)

一元&运算符获取指向变量的指针。因此,在C ++中(如在C中)a = &b获取指向b的指针并将此值存储在a中,因此如果b的类型为inta必须是int*类型。另一方面,对引用的赋值是隐式的,因此如果a类型为int&,则只需编写a=b即可使a引用b。因此,在您的情况下,您需要将构造函数重写为

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}

但是,我觉得你最好不要使用指针而不是 ,并试图使用C ++而不熟悉指针是一个非常糟糕的主意。所以我建议你花点时间让自己习惯使用指针而不是试图避免它们。