关于c++函数重载的问题(很简单)

daryl715 2002-01-01 07:14:58
源程序
#include "iostream.h"
inline int square(int i){return i*i;}
inline double square(double i){return i*i;}
int main()
{
cout<<square(7)<<endl<<"\n";
cout<<square(7.5)<<endl<<"\n";
return 0;
}

程序正确结果
49
56.25
但把源程序改成
#include "iostream.h"
inline int square(int i){return i*i;}
inline float square(float i){return i*i;}
int main()
{
cout<<square(7)<<endl<<"\n";
cout<<square(7.5)<<endl<<"\n";
return 0;
}

就会报错?double和float除了精度不一样,这也有区别吗 ?
为什么会出现这样的错误?
...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
daryl715 2002-01-02
  • 打赏
  • 举报
回复
谢谢大家的回答 ,希望常联系
岂能尽如人意,但求无愧我心,很高兴认识大家!
QQ:341157
E-mail:daryl@ihw.com.cn
  • 打赏
  • 举报
回复
我同意大家的意见,在The C++ Programming Language中提到,所有的类似2.6,3.1等数字都是默认为double类型,所以应该显式转换为float类型。
cloudshadow1 2002-01-01
  • 打赏
  • 举报
回复
我想,这是跟编译器有关的了,这段代码拿到Broland的编译器上可以就可以通过了。
在VC,7.5被认为是double类型的了(64位),当你调用square时,就有这个过程:
double->float(32位)这时VC编译器进得类型检查,正是由于VC的类型安全机制,转换过程报告内存溢出(因为高32位不见了(即使全为0))。注意,在调用函数时,C语言是不允许形参和实参的长度不一样!
你可以这样:
cout<<square((float)7.5)<<endl<<"\n";
先进得强制类型转换就可以通过了!
freewing 2002-01-01
  • 打赏
  • 举报
回复
float在表达式中作为double看,像CalHua说的那样
我不是大明 2002-01-01
  • 打赏
  • 举报
回复
回去帮你看一下,C++是如何重载cout的
daryl715 2002-01-01
  • 打赏
  • 举报
回复
依然报错误
error C2668: 'square' : ambiguous call to overloaded function
Error executing cl.exe.
  • 打赏
  • 举报
回复
新年快乐。
程序报什么错?
你把inline float square(float i){return i*i;}改为inline double square(float i){return i*i;}试试。不知行不行,我也只是记得在哪里看到过,好像类似两个float之积应该相当于double。就是精度应该上升一级。不知是不是这个原因。
我也是很久以前好像在哪里偶尔看到过的,不知对不对。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧