当我按值传递参数时,c++构建消息显示一个引用参数
c++ bulid message shows a reference argument while i pass arguments by value
我在Code::Blocks下使用GNU GCC编译器。
int foo(long s){cout<<"long"<<endl;return 0;}
int foo(float s){cout<<"float"<<endl;return 0;}
int main()
{
double a(3.2);
foo(a);
return 0;
}
我知道这会触发模棱两可的错误,但是构建消息告诉我
error: call of overloaded 'foo(double&)' is ambiguous
我确实是按双变量的值传递实参,而不是像上面那样通过引用传递实参。
当我使用const double类型时:
foo(3.2); // enclosed in main function
构建消息告诉我如下错误:
error: call of overloaded 'foo(double)' is ambiguous.
不知道为什么会这样。
传递过程在双精度变量和const双精度变量之间不一样吗?
foo(long)
和foo(float)
都不完全符合您的参数。由于double
可以隐式地转换long
和float
,所以调用是雄心勃勃的。
您可以为double
提供额外的重载,或者使用适当的参数类型。
double bar = 3.2;
foo(bar);
这是因为bar
是左值,而完美匹配的是double&
。但是,如果您提供foo(double)
重载,它只会接受这个函数。
foo(3.2)
传递的是双精度类型,所以编译器不知道你是指要调用foo
的long
还是float
版本。
我想我不会过分解读这个错误。编译器告诉你一个可能的类型,它已经检测到给定的调用位置,但是如果有一个匹配foo(double)
的函数调用,引用将衰减。
除了为double
提供重载之外,还可以使用3.2f
float
。从这一小段代码我不能告诉他为什么给你那个特定的错误。我试着重新创造它,但没有& &;你能展示整个代码或一个更大的例子,有相同的错误吗?
当你调用
foo(3.2);
编译器不知道你指的是哪一个-"3.2"可以强制转换为float或long类型。
如果你打电话:
foo((float)3.2);
它的工作原理。
你的问题似乎是为什么错误是关于双&-这是因为你的双变量与foo(double&)的重载最接近。
我想你把double类型和类型的变量混淆了。看看这两个例子中的区别:
foo(3.2)
这里编译器告诉你没有重载的方法接受a<<strong>双类型/strong>
double a(3.2);
foo(a);
在本例中,实际上是传入变量,但由于没有重载函数可以传入double类型的变量(即double&),因此它告诉您没有重载方法接受双变量或double&
。- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何制作一个将函数作为参数的类方法
- 修改函数中的指针(将另一个指针作为参数传递)
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 构造函数在退出函数时无法初始化一个参数
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 运算符重载:"operator+"必须采用零个或一个参数
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 如何在另一个函数中使用返回值作为参数?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 将参数一个接一个地传递,或通过将它们包裹在数组,结构或元组中
- 如何给一个参数一个由其他参数的函数确定的默认值
- C++如何给一个参数一个特定的枚举,它可以是
- 如果我在默认构造函数中放了一个参数,但给了这个参数一个默认值,它还是一个默认构造函数吗
- 为什么在c++中给typename模板参数一个默认值0 ?