Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个函数调用在C++;?_C++_Overloading_Ambiguous_Ambiguous Call_Type Promotion - Fatal编程技术网

C++ 这个函数调用在C++;?

C++ 这个函数调用在C++;?,c++,overloading,ambiguous,ambiguous-call,type-promotion,C++,Overloading,Ambiguous,Ambiguous Call,Type Promotion,考虑以下程序:(请参阅此处的实时演示) 但我不明白为什么&它是如何模棱两可的?这里是否有任何类型的自动类型升级?我知道使用(3L)调用fun会使编译成功。可能3可以解释为其他类型(如char,unsigned…),因此编译器可能不清楚要调用什么函数。您需要指出值3是一个长int #include <iostream> void fun(int*)=delete; void fun(double)=delete; void fun(char)=delete; void fun(unsi

考虑以下程序:(请参阅此处的实时演示)


但我不明白为什么&它是如何模棱两可的?这里是否有任何类型的自动类型升级?我知道使用(3L)调用fun会使编译成功。

可能3可以解释为其他类型(如
char
unsigned
…),因此编译器可能不清楚要调用什么函数。您需要指出值3是一个
长int

#include <iostream>
void fun(int*)=delete;
void fun(double)=delete;
void fun(char)=delete;
void fun(unsigned)=delete;
void fun(float)=delete;
void fun(long int);
int main()
{
    fun((long int)3);
}
void fun(long int a)
{
    std::cout<<a<<'\n';
}
#包括
void fun(int*)=删除;
无效乐趣(双倍)=删除;
void fun(char)=删除;
无效乐趣(未签名)=删除;
无效乐趣(浮动)=删除;
虚无乐趣(长int);
int main()
{
乐趣((长int)3);
}
虚无乐趣(长整数a)
{

std::coutIt的含义不明确,因为您声明的函数中没有一个采用普通的
int
,编译器无法选择是否转换为
double
char
unsigned int
float
long int
d函数仍然参与重载解析。@user657267我认为您可以将其添加为答案:)@user657267:如果您将其添加为答案,这样我就可以接受它。@user657267是或这样称呼它:fun(3L)@PravasiMeet是的,当然。只要您确保编译器不会混淆调用什么。避免使用“C”C++中的风格转换。cast@Krypton,该注释应该是一个答案,在这种情况下,您的答案是没有必要的。但是他们没有,所以您的答案是相关的。但是,为什么在您可以简单地创建类型时强制转换?我相信编译器足够聪明,可以做正确的事情,但是使用c是更好的实践首先,南渡:我个人认为C样式的转换对于简单的标量类型来说更好,C++等价的更冗长,没有明显的优势。
error: call of overloaded 'fun(int)' is ambiguous
  fun(3);
       ^
#include <iostream>
void fun(int*)=delete;
void fun(double)=delete;
void fun(char)=delete;
void fun(unsigned)=delete;
void fun(float)=delete;
void fun(long int);
int main()
{
    fun((long int)3);
}
void fun(long int a)
{
    std::cout<<a<<'\n';
}