注册 登录
编程论坛 C++教室

[求助]为什么这样不能实现隐式类型转换?

haitaotao 发布于 2008-10-10 15:50, 1555 次点击
定义复数类Complex
头文件中:
#include <iostream>
using namespace std;

class Complex
{
  friend Complex operator + (Complex&, Complex&);
public:
  Complex();
  Complex(double);//将双精度型转换成Complex型
  Complex(double, double);
  ...
private:
  double real;
  double imag;
};
Complex::Complex(double r)
{
  real = r;
  imag = 0;
}
……
在main文件中

……
Complex c1(3,-4);
c2 = 4.0 + c2;
……
编译时g++说
$ g++ -c main.cpp
main.cpp: In function `int main()':
main.cpp:26: error: no match for 'operator+' in '4.0e+0 + c2'
complex.h:17: note: candidates are: Complex operator+(Complex&, Complex&)

这是为什么?不是系统会隐式调用Complex(double)吗?

还有friend Complex operator + (Complex&, Complex&);
我重载了+
friend Complex operator + (Complex& c1, Complex& c2)
{
  return Complex(c1.real + c2.real, c1.imag + c2.imag);
}

[[it] 本帖最后由 haitaotao 于 2008-10-10 15:54 编辑 [/it]]
11 回复
#2
song42008-10-10 19:28
c2 = 4.0 + c2; ->   c2 = c2+4.0;
我没编译器 你看看这么改下对不对
我很久没用了 拿不准
#3
守鹤2008-10-10 19:35
可以的
#4
haitaotao2008-10-10 21:17
回复 2# song4 的帖子
改了,不行
#5
sunkaidong2008-10-10 21:39
#include "stdafx.h"
#include<iostream>
using namespace std;
class Complex
{
public:
  friend Complex operator + (Complex& c1, Complex& c2);
  Complex(double ,double);//将双精度型转换成Complex型
  void play();
private:
  double real;
  double imag;
};
Complex::Complex(double a,double b)
{
  real = a;
  imag = b;
}
 Complex operator + (Complex& c1, Complex& c2)
{
    return Complex(c1.real + c2.real, c1.imag + c2.imag);
};
 void Complex::play()
 {
     cout<<real<<" "<<imag<<endl;
 }
int main()
{
Complex c1(3,-4);
Complex c2(3,4);
c2 = c1 + c2;
c2.play();
return 0;
}
#6
sunkaidong2008-10-10 21:40
你的类型就不匹配,不要认为计算机很聪明啊。。呵呵
c2 = 4.0 + c2;
Complex operator + (Complex& c1, Complex& c2);
不是一回事啊
#7
haitaotao2008-10-11 21:38
回复 6# sunkaidong 的帖子
不是在执行
c2 = 4.0 + c2
时,编译器会隐式地调用Complex(double)
函数,将4.0转换成Complex(4,0),
然后在执行Complex operator + (Complex& c1, Complex& c2)
的吗?
书上说这种隐式调用可以避免函数重载,你们看呢?
#8
haitaotao2008-10-21 23:09
自问自答
总算搞定了!!!
注意Complex operator + (Complex& c1, Complex& c2)
参数是Complex&
而隐式调用只能实现一步转换,几把2.0转换为(2.0,0i),而不能一步转换成Complex&型
解决方法只需将Complex operator + (Complex& c1, Complex& c2)
改为Complex operator + (Complex c1, Complex c2)
就行了
\(^o^)/
#9
newyj2008-10-22 13:06
Complex(4,0) 是 类类型常量 可以把预定义的类型转换成类类型的
#10
wangluxi2008-10-22 16:54
using namespace std;
什么意思?
以前学c++时没见过
哪位大虾指点一下?
#11
haitaotao2008-10-23 12:08
回复 9# newyj 的帖子
网上搜搜吧,c++里的名字空间
#12
newyj2008-10-23 13:00
回复 11# haitaotao 的帖子
?
Complex(4,0) 是 类类型常量 可以把预定义的类型转换成类类型的
怎么扯到名字空间了啊?
1