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
。
如果你想为你的Box
class手动实现赋值operator=()
(注意编译器会实现一个默认member-wise assignment operator=
如果你不提供),考虑遵循这样的模式:
- 使用
const Box&
(不仅仅是Box&
)作为输入源类型,因为您没有修改源;
- 检查重载运算符实现中的自赋值 (
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
您正在 不 复制。这是一个错字吗?你真的确定你不想复制它吗?也许这是一个错误?
我目前正在做一个关于移动机器人的作业。我正在使用 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
。
如果你想为你的Box
class手动实现赋值operator=()
(注意编译器会实现一个默认member-wise assignment operator=
如果你不提供),考虑遵循这样的模式:
- 使用
const Box&
(不仅仅是Box&
)作为输入源类型,因为您没有修改源; - 检查重载运算符实现中的自赋值 (
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
您正在 不 复制。这是一个错字吗?你真的确定你不想复制它吗?也许这是一个错误?