C++ 不匹配 'operator='

C++ no match for 'operator='

我目前正在做一个关于移动机器人的作业。我正在使用 CMake 和 Visual C++ Compiler 10.0 在 Windows 和 QT-Creator 上进行开发。

由于机器人在 Ubuntu 上工作,我需要使用 GNU x86 编译器在 Ubuntu 上使用 QT-Creator 编译项目。

现在问题来了,关于 class Box,它只是存储一些 int-values:

Box.h

public:
Box();                                                                  
Box(int name, int sX, int sY, int width, int heigth);               
Box& operator = (Box &src);                                             
bool operator == (Box &src);                                     

private:
int name;                                                              
int startX, startY, endX, endY;                                       
int cgx, cgy;                                                        
int width, height;

这个header里面还有一些get-methods(比如int getName())。

重载的 assignment-operator 如下所示:

Box &Box::operator =(Box &src){
    this->cgx = src.getCenterX();
    this->cgy = src.getCenterY();
    this->endX = src.getEndX();
    this->endY = src.getEndY();
    this->startX = src.getStartX();
    this->startY = src.getStartY();

   return *this;} 

我正在另一个 class 中使用 Box objects,存储在 std::list<Box>

在 Windows 上,一切正常。但是在 Ubuntu 我得到 error-message no match for 'operator=' (operand types are 'Box' and 'const Box') ,它发生在 std::list.

的函数中

我对 C++ 很陌生,还没有在任何地方使用过 const explicit。那么这个错误是怎么发生的,我该如何解决呢?

赋值运算符应该接受 const 对象:

Box& operator = (const Box& src);

因为它不会影响src,只会影响this

在定义复制运算符的同时,还应该定义复制构造函数。参见 http://en.cppreference.com/w/cpp/language/rule_of_three

比较运算符应该接受一个 const 对象并且应该是 const(函数不会改变 this)。

bool operator == (const Box& src) const;

因为不会影响src,也不影响this

尝试将参数定义为 const:

Box& operator = (const Box &src);                                             

此外,您应该为比较做同样的事情,即使这不是您问题的根源:

bool operator == (const Box &src) const;  

我怀疑您的赋值或比较的右侧是 const。请注意,此模式是一种很好的做法,因为您没有修改参数。

我也做了比较 const 因为你不会修改 this

如果你想为你的Boxclass手动实现赋值operator=()(注意编译器会实现一个默认member-wise assignment operator= 如果你不提供),考虑遵循这样的模式:

  1. 使用const Box&(不仅仅是Box&)作为输入源类型,因为您没有修改源;
  2. 检查重载运算符实现中的自赋值 (if (&src != this)...)。

在代码中:

Box& Box::operator=(const Box& src) 
{
    if (&src != this) 
    {
        this->cgx = src.getCenterX();
        this->cgy = src.getCenterY();
        this->endX = src.getEndX();
        this->endY = src.getEndY();
        this->startX = src.getStartX();
        this->startY = src.getStartY();
    }
    return *this;
} 

另请注意,如果您手动定义一个复制赋值 operator=(),您可能还想定义一个 复制构造函数,可能遵循在您的代码中实现的相同复制逻辑赋值 operator=():

Box(const Box& src) :
    cgx   ( src.getCenterX() ),
    cgy   ( src.getCenterY() ),
    endX  ( src.getEndX()    ),
    endY  ( src.getEndY()    ),
    startX( src.getStartX()  ),
    startY( src.getStartY()  )
{}

注意

您的 Box class 中有一个数据成员 name 您正在 复制。这是一个错字吗?你真的确定你不想复制它吗?也许这是一个错误?