Предположение типа по умолчанию функцией шаблона - PullRequest
2 голосов
/ 25 августа 2011

Пример. Предполагается, что f является функцией шаблона и имеет два аргумента:

f (1, 2) В этом вызове функция шаблона предполагает, что ее аргументы равны int, или short, или что-то еще?

РЕДАКТИРОВАТЬ 1:

Объявление функции шаблона:

template <typename dataTypeA, typename dataTypeB> dataTypeB functionX (dataTypeA argA, dataTypeB argB)

Ответы [ 2 ]

7 голосов
/ 25 августа 2011

Шаблон не предполагает ничего.Литералы имеют тип int, и это будет тип, который выводит компилятор.

3 голосов
/ 25 августа 2011

Как уже сказал @David, что касается вашего вопроса, нет такой вещи, как "делать предположения". Литералы просто имеют типы, которые являются типами, которые шаблон функции может использовать для вывода типа. Помните, что преобразования считаются частью соответствия шаблона, хотя!

Итак, допустим, у вас есть этот шаблон функции:

template <typename T> void foo(T x, T y);

Тогда, если вы позвоните foo(1, 2), это будет вызвано с T = int.

Если вы скажете foo(1u, 2u), вычет будет T = unsigned int.

Если вы скажете что-нибудь смешанное, например foo(1u, 2), предпочтительного совпадения не будет, и компилятор сообщит об ошибке.

Поскольку в C или C ++ нет литерала short, если вы хотите явно вызвать функцию foo<short>, вы можете либо сказать так, либо создать временные явные short аргументы:

foo<short int>(3, 4);
foo<short int>(3u, 4l);  // also OK because of conversion
foo(short(3), short(4)); // deduction

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

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