C++ 运算符重载 : no known conversion from object to reference?

标签 c++ operator-overloading

当我尝试编译以下 (g++ 4.6.3)

class A {};

A& operator*=( A& a, const A& b )
{
  return a;
}

A operator*( const A& a, const A& b )
{
  return A( a ) *= b;
}

int main( int, char*[] )
{
  A a, b;

  a = a*b;

  return 0;
}

我得到了错误

/tmp/test.cxx: In function ‘A operator*(const A&, const A&)’:
/tmp/test.cxx:14:20: error: no match for ‘operator*=’ in ‘(* & a) *= b’
/tmp/test.cxx:14:20: note: candidate is:
/tmp/test.cxx:6:1: note: A& operator*=(A&, const A&)
/tmp/test.cxx:6:1: note:   no known conversion for argument 1 from ‘A’ to ‘A&’

这让我很困惑 - 从一个类到对该类的引用的转换怎么可能不知道?

如下更改A类的声明没有任何效果:

class A
{
public:
  A() {}
  A( const A& ) {}
};

同样的错误。

我将非常感谢有关这里发生的事情的提示。

最佳答案

就像 Lucian 所说,您不能将临时对象绑定(bind)到非常量引用。编译器的期望是对象将在表达式之后不复存在,因此修改它没有意义。

要修复您的代码,请删除临时代码(使参数 const&operator *= 中没有意义):

A operator*(A a, const A& b)
{
    return a *= b;
}

关于C++ 运算符重载 : no known conversion from object to reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236240/

相关文章:

c++ - 如何将 LONG 转换为 CString?

c++ - 为 STL 容器重载 operator<<()

c++ - vector 和 []-运算符重载

c++ - 何时何地为 caffe 调用和执行 `REGISTER_SOLVER_CLASS(SGD);`?

c++ - strncpy 运行时检查失败 #2 错误 c++

c++ - 当我按值而不是按引用返回时,为什么不能调用运算符?

python - 是否可以在 Python 中重载/导入?

C++ operator+ 和 operator+= 重载

C++ 模板 :-Warning in a function template

c++ - 无法编译顶点着色器 : Unexpected $end at token "<EOF>"