我知道这个交易。编译器试图在转换运算符的帮助下将一个对象转换为另一个对象的类型。有两种方法可以做到这一点。构造函数(将一个类转换为另一个)或转换运算符。所以,这个只是为了测试我是否对这些概念很透彻。下面的代码给出了错误
using namespace std ;
class A
{
int i ;
public:
A(int a=0){this->i=a;}
A operator+(const A& b){
A c ;
return c(this->i+b.i);
}
void show()
{
cout<<i<<endl;
}
};
int main()
{
A a1(1),a2(2),a3;
a3=a2+a1;
a3.show();
return 0;
}
我猜错误出在运算符 + 中。当我尝试分配 A(i) 时。没有匹配可以从 int 创建 A 的运算符。
但是然后我看到这个 A 的构造函数隐藏在后面。它可以将 int 转换为 A。假设,它确实将 int 转换为 A。然后,调用变为 A(B)。这相当于复制构造函数。因此,这个调用应该有效。但它没有。总而言之,我很困惑。
请帮忙。
最佳答案
在这两行中,您告诉编译器使用默认构造函数构造一个 A 对象,然后调用其不存在的运算符 () (int) 并返回其返回值:
A c ;
return c(this->i+b.i);
使用其中之一
A c(i + b.i);
return c;
或
return A(i + b.i);
旁注,隐式转换运算符的示例,适用于您的类:
operator int () const
{
return i;
}
但是它们的使用闻起来像是糟糕的设计,并且会导致糟糕的事情发生,比如隐式转换为 bool 或指针。使用其他东西代替,例如 int toInt () const
成员函数。
关于C++ 转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6560736/