Функция перегрузки по типу возврата? (Повторно) - PullRequest
2 голосов
/ 13 апреля 2011

Может кто-нибудь сказать, чем отличается компилятор в следующих двух случаях?

   #include <cstdio>
    using namespace std;

    template <typename TReturn, typename T>
    TReturn convert(T x)
    {
        return x;
    }

    int main()
    {

       printf("Convert : %d %c\n", convert<int, double>(19.23), convert<char, double>(100));   
       return 0;
    } 

И

int convert(double x)
{
   return 100;
}

char convert(double x)
{
   return 'x';
}         

int main()
{ 
   printf("Convert : %d %c\n", convert(19.23), convert(100));     // this doesn't compile
   return 0;
} 

В первом случае нет перегрузки функций?

1 Ответ

7 голосов
/ 13 апреля 2011

Когда компилятор встречает этот вызов функции шаблона, он использует шаблон для автоматической генерации функции, заменяющей каждое появление типом, переданным в качестве фактического параметра шаблона (в данном случае удваивается), а затем вызывает его.Этот процесс автоматически выполняется компилятором и невидим для программиста.Таким образом, он также реализует абстракцию и сокрытие данных.

Компилятор не рассматривает шаблоны как обычные функции или классы.Они компилируются по требованию, это означает, что код функции шаблона не компилируется до тех пор, пока не потребуется.

Второй пример не перегружен.Вы неправильно конвертировали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...