C++ 函数重复声明时,添加默认实参问题。 5C

在原书《C++ Primer 5th》中(P212),如下写到:在原有默认值的下,添加其他默认值是正确的声明。
图片说明


但是在测试时,编译器(vs2015)却报错了。
图片说明


执行程序时,可以正确执行,但是还是会输出这个错误。

void screen(int w, int h, string s) { cout << (w * h) << " " + s; }

void screen(int w, int h, string s = "stringgggg");

void screen(int w = 32, int h = 16, string s);

void main()
{
    screen();
}

输出结果:
512 stringgggg

请问为什么报错?怎么解决?

1

10个回答

因为你的默认实参位置写错了,默认实参必须先满足最右边的再依次往左走,第三个函数最右边的string必须写默认实参,因为它左边的都有实参了,右边的必须也要有,成功的话,忘采纳我的意见

1
l773575310
ChiLi_Lin 注意前面还有一句声明,已经把第三个参数设置默认实参了,后面一句是补充前面默认实参的声明。
一年多之前 回复

第三个函数的参数默认值不能这样给。 如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义。

1

编译出错了 还能正确执行? 你这个是启动上一次成功的实例的结果吧,

0
l773575310
ChiLi_Lin 还真是正确执行了,在这个函数后面再加一句输出语句,执行时也输出了。
一年多之前 回复

默认实参位置写错了,函数传参顺序从右到左

0
l773575310
ChiLi_Lin 注意前面还有一句声明,已经把第三个参数设置默认实参了,后面一句是补充前面默认实参的声明。
一年多之前 回复

这样应该没有错误。这个错误提示不是编译时输出的吧?是不是助手之类的提示错误?

0

你重载的最后一个screen()在string s后面再加一个默认

0

出现有红色下划线并不表示就一定是错误,主要还是看编译以后是不是报错

0

有没有人试一试?再告诉我是不是只有我的编译器(VS2015)是这样。

0

图片说明真的能运行哦

0
Starck_Tony
Starck_Tony 你调用screen函数也没传参,可能编译器优化了一些东西吧
一年多之前 回复

我用devc++和vs2017都测试了下,都会显示添加参数那条没有把默认参数写在最右边,可能这个特性不是所有编译器都支持吧

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!