为什么函数重载会在C++中产生不明确的错误?
Why does function overloading generate an ambiguous error in C++?
在下面的代码片段中,在函数调用f(1)
中,1
是类型为int
的文本,在第一个函数中void f(double d)
参数类型是double
,第二个函数void f(short int i)
参数类型是short int。
这里1
是int
类型而不是double
类型,那么为什么编译器会产生歧义错误?
#include <iostream>
using namespace std;
void f(double d) // First function
{
cout<<d<<endl;
}
void f(short int i) // Second function
{
cout<<i<<endl;
}
int main()
{
f(1); // 1 is a literal of type int
return 0;
}
因为,正如您的评论所指出的,1
是int
类型的文字。
对于编译器来说,int
到short int
的隐式转换与int
到double
的隐式转换同样有效(参见C++语言标准,§13.3)。
因此,由于编译器无法在double
和short int
重载之间做出决定,因此它会放弃并发出诊断。
请注意,函数参数的大小无关紧要:重要的是类型。
(如果编译器在运行时选择short int
重载(如果调用参数合适),而在其他情况下double
重载,那将很烦人。
相关文章:
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- gcc出现不明确的模板实例化错误
- "byte":使用Crypto++和Windows SDK时出现不明确的符号错误
- 使用 std::iterator_traits<> 时编译时错误不明确
- 在类Bat代码中,这给了我错误:重载的"Bat()"的调用是不明确的Bat(;)
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 不明确的错误重载运算符<<QdataStream 子类和个人类
- 模板上下文中的"不明确的基类"错误
- C++ 模板不明确错误
- 为什么调用不明确的 ctor 时没有编译时错误?
- G++ 错误:重载的"abs(无符号 int)"的调用不明确
- 提升错误:"运算符=="的重载不明确
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 错误:在为 i386 构建时,使用重载运算符'[]'不明确
- 错误:重载'stoi(nlohmann::basic_json<>::value_type&)'的调用不明确
- 错误:重载的"abs(double)"调用不明确
- 运算符重载和函数重载产生不明确的编译器错误
- 继承类 c++ 中的不明确错误