4

Рассмотрим следующую программу: (См видеодемонстрацию здесь http://ideone.com/7VHdoU)Как этот вызов функции неоднозначен в C++?

#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(3); 
} 
void fun(long int a) 
{ 
    std::cout<<a<<'\n'; 
} 

Компилятор дает следующее сообщение об ошибке:

error: call of overloaded 'fun(int)' is ambiguous 
    fun(3); 
    ^

Но я не понимаю, почему & как это неоднозначно? Включает ли это какое-либо автоматическое продвижение по типу? Я знаю, что вызов fun (3L) делает компиляцию успешной.

+9

Это неоднозначное, потому что ни одна из функций, заявивших не принимают простой 'int', и компилятор не может выбрать, следует ли преобразовать в' double', '' char', без знака int', 'float' или' длинный int'. Функции 'delete'd все еще участвуют в разрешении перегрузки. – user657267

+1

@ user657267 Я думаю, вы можете добавить это в качестве ответа :) – KennethLJJ

+1

@ user657267: Лучше, если вы добавите его в качестве ответа, чтобы я мог его принять. – Destructor

ответ

2

Возможно, 3 можно интерпретировать как другие типы (например, char, unsigned ...), поэтому для компилятора может быть неоднозначно знать, какую функцию вы хотите вызвать. Необходимо указать значение 3: long 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'; 
} 
+2

или называйте это: fun (3L) – Destructor

+0

Я не читал комментарий @ user657267. Мой ответ, возможно, не нужен здесь. – Krypton

+1

@PravasiMeet Да, конечно. Пока вы заставляете компилятор не путать, что звонить. – Krypton