2015-11-07 2 views
4

Почему следующий код всегда печатает «тип double»? (Я видел этот код в StackOverflow)Почему вызвана неподходящая перегруженная функция?

#include <iostream> 


void show_type(...) { 
    std::cout << "type is not double\n"; 
} 

void show_type(double value) { 
    std::cout << "type is double\n"; 
} 

int main() { 
    int x = 10; 
    double y = 10.3; 

    show_type(x); 
    show_type(10); 
    show_type(10.3); 
    show_type(y); 


    return 0; 
} 

ответ

9

http://en.cppreference.com/w/cpp/language/overload_resolution говорит:

Стандартная последовательность преобразования всегда лучше, чем определенный пользователем последовательность преобразования или последовательность преобразования многоточие.

0
void show_type(double value) { 
     std::cout << "type is double\n"; 
    } 

если и комментарий выше линии, то выход будет

type is not double 
type is not double 
type is not double 
type is not double 

это означает, что компилировать всегда предпочитают void show_type(double value) над void show_type(...).

в вашем случае, если вы хотите вызвать метод пустот show_type (...) передать два или более аргументов, когда и вызывать этот метод show_type(firstParameter,secondParameter)

#include <iostream> 


void show_type(...) { 
    std::cout << "type is not double\n"; 
} 

void show_type(double value) { 
    std::cout << "type is double\n"; 
} 

int main() { 
    int x = 10; 
    double y = 10.3; 

    show_type(x); 
    show_type(10); 
    show_type(10.3); 
    show_type(y); 
    show_type(4.0,5); //will called this method show-type(...) 


    return 0; 
} 

теперь выход выше линии будет

type is double 
type is double 
type is double 
type is double 
type is not double //notice the output here 

more info on var-args

Смежные вопросы