与转换构造函数和类型转换函数有关的二义性问题

时间:2021-05-05 19:28:55
#include <iostream>
using namespace std;
class Complex
 {public:
   Complex(){real=0;imag=0;}
   Complex(double r){real=r;imag=0;}
   Complex(double r,double i){real=r;imag=i;}
   operator double(){cout<<return real;}
   friend Complex operator + (Complex c1,Complex c2);                
   void display();
  private:
   double real;
   double imag;
 };
 
Complex operator + (Complex c1,Complex c2)
 {return Complex(c1.real+c2.real, c1.imag+c2.imag);}
   
void Complex::display()
{cout<<"("<<real<<","<<imag<<"i)"<<endl;}

int main()
{Complex c1(3,4),c2(5,-10),c3;
 c3=c1+2.5;
 c3.display();
 return 0;
}
这个程序的错误在于有二义性!
但是我不知道原因是从哪里引起的!
望高手指教。。。。。。

9 个解决方案

#1


c3=c1+Complex(2.5); 


  operator double(){return real;} 
  friend Complex operator + (Complex c1,Complex c2);      


c.c:24: note: candidates are: operator+(double, double) <built-in>
c.c:17: note:                 Complex operator+(Complex, Complex)

#2


去看《C++ Primer》在讲解了自定义类型转换后,重总结重载判决规则的章节,一条条对,你就会发现原因了。

#3


因为你定义了一个
operator double();
同时又有一个单参的构造函数:
Complex(double r);
所以编译
 c3=c1+2.5; 
时, 编译器不知道是通过构造函数Complex(double r)将2.5转换为Complex好呢, 
还是通过operator double()将c1转换为double好呢.

所以去掉operator double()就可以了.

#4


operator double(){cout < <return real;}

没见过。。。

谁能解释一下。。。或给个链接

如果太简单。。。那就当什么也没发生

#5


是一种 定义隐藏的 转换??把 double 转换成 complex ??

那把  Complex(double r){real=r;imag=0;} 去了。。   是不是也正确??

#6


引用 5 楼 archior 的回复:
是一种 定义隐藏的 转换??把 double 转换成 complex ?? 

那把  Complex(double r){real=r;imag=0;} 去了。。  是不是也正确?? 

但是赋值就不正确了,一个double赋给一个Complex

#7


引用 1 楼 baihacker 的回复:
C/C++ codec3=c1+Complex(2.5); 


  operator double(){return real;} 
  friend Complex operator + (Complex c1,Complex c2);      


c.c:24: note: candidates are: operator+(double, double) <built-in>
c.c:17: note:                 Complex operator+(Complex, Complex)

呵呵 很明显!~

#8


因为你没有定义Complex(int,int){}

#9


C/C++ codec3=c1+Complex(2.5); 


  operator double(){return real;} 
  friend Complex operator + (Complex c1,Complex c2);      


c.c:24: note: candidates are: operator+(double, double) <built-in> 
c.c:17: note:                Complex operator+(Complex, Complex) 
 
这些都是什么意思?
看不懂,望指教....

#1


c3=c1+Complex(2.5); 


  operator double(){return real;} 
  friend Complex operator + (Complex c1,Complex c2);      


c.c:24: note: candidates are: operator+(double, double) <built-in>
c.c:17: note:                 Complex operator+(Complex, Complex)

#2


去看《C++ Primer》在讲解了自定义类型转换后,重总结重载判决规则的章节,一条条对,你就会发现原因了。

#3


因为你定义了一个
operator double();
同时又有一个单参的构造函数:
Complex(double r);
所以编译
 c3=c1+2.5; 
时, 编译器不知道是通过构造函数Complex(double r)将2.5转换为Complex好呢, 
还是通过operator double()将c1转换为double好呢.

所以去掉operator double()就可以了.

#4


operator double(){cout < <return real;}

没见过。。。

谁能解释一下。。。或给个链接

如果太简单。。。那就当什么也没发生

#5


是一种 定义隐藏的 转换??把 double 转换成 complex ??

那把  Complex(double r){real=r;imag=0;} 去了。。   是不是也正确??

#6


引用 5 楼 archior 的回复:
是一种 定义隐藏的 转换??把 double 转换成 complex ?? 

那把  Complex(double r){real=r;imag=0;} 去了。。  是不是也正确?? 

但是赋值就不正确了,一个double赋给一个Complex

#7


引用 1 楼 baihacker 的回复:
C/C++ codec3=c1+Complex(2.5); 


  operator double(){return real;} 
  friend Complex operator + (Complex c1,Complex c2);      


c.c:24: note: candidates are: operator+(double, double) <built-in>
c.c:17: note:                 Complex operator+(Complex, Complex)

呵呵 很明显!~

#8


因为你没有定义Complex(int,int){}

#9


C/C++ codec3=c1+Complex(2.5); 


  operator double(){return real;} 
  friend Complex operator + (Complex c1,Complex c2);      


c.c:24: note: candidates are: operator+(double, double) <built-in> 
c.c:17: note:                Complex operator+(Complex, Complex) 
 
这些都是什么意思?
看不懂,望指教....