| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1539 人关注过本帖, 1 人收藏
标题:[求助]为什么这样不能实现隐式类型转换?
只看楼主 加入收藏
haitaotao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-7-14
收藏(1)
 问题点数:0 回复次数:11 
[求助]为什么这样不能实现隐式类型转换?
定义复数类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]]
搜索更多相关主题的帖子: 类型 
2008-10-10 15:50
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
c2 = 4.0 + c2; ->   c2 = c2+4.0;
我没编译器 你看看这么改下对不对
我很久没用了 拿不准

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2008-10-10 19:28
守鹤
Rank: 4
来 自:山東臨沂
等 级:贵宾
威 望:12
帖 子:337
专家分:0
注 册:2008-6-20
收藏
得分:0 
可以的

多少个日日夜夜想起你,只希望有缘再次相见
2008-10-10 19:35
haitaotao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-7-14
收藏
得分:0 
回复 2# song4 的帖子
改了,不行
2008-10-10 21:17
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#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;
}

学习需要安静。。海盗要重新来过。。
2008-10-10 21:39
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你的类型就不匹配,不要认为计算机很聪明啊。。呵呵
c2 = 4.0 + c2;
Complex operator + (Complex& c1, Complex& c2);
不是一回事啊

学习需要安静。。海盗要重新来过。。
2008-10-10 21:40
haitaotao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-7-14
收藏
得分:0 
回复 6# sunkaidong 的帖子
不是在执行
c2 = 4.0 + c2
时,编译器会隐式地调用Complex(double)
函数,将4.0转换成Complex(4,0),
然后在执行Complex operator + (Complex& c1, Complex& c2)
的吗?
书上说这种隐式调用可以避免函数重载,你们看呢?
2008-10-11 21:38
haitaotao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-7-14
收藏
得分:0 
自问自答
总算搞定了!!!
注意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^)/
2008-10-21 23:09
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
Complex(4,0) 是 类类型常量 可以把预定义的类型转换成类类型的
2008-10-22 13:06
wangluxi
Rank: 2
等 级:论坛游民
帖 子:27
专家分:29
注 册:2008-10-22
收藏
得分:0 
using namespace std;
什么意思?
以前学c++时没见过
哪位大虾指点一下?
2008-10-22 16:54
快速回复:[求助]为什么这样不能实现隐式类型转换?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017484 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved