Какая функция будет вызвана, если существует шаблон функции, который может соответствовать другой перегруженной функции?

0

В C++, скажем, у вас есть два определения функций:

template <typename T>
T square (T num);

А также

double square(double num);

и у вас есть вызов функции, например:

square(1.5);

какую функцию вызывать? Что выбирает компилятор?

  • 2
    Почему бы не скомпилировать и не увидеть?
  • 0
    У меня возникла проблема с компилятором при попытке использовать функцию шаблона, которую я не смог понять. Я только начал изучать шаблоны.
Показать ещё 1 комментарий
Теги:

3 ответа

2
Лучший ответ

В этом случае C++ всегда предпочитает нестратегированную версию функции, так как она может легко продвигать float в double.

Если бы вы использовали это:

float p = 2.2;
square(p);

компилятор выбрал бы шаблонную версию в своем стремлении к идеальной игре.

  • 3
    Было бы разумно заметить, что литерал 1.5 интерпретируется как double , поэтому будет вызвана его вторая функция. Если бы он определил второй square чтобы взять поплавок, шаблон будет использоваться.
  • 0
    «как это может легко продвинуть поплавок к удвоению» - что вы имеете в виду?
Показать ещё 1 комментарий
3

Аргумент 1.5 имеет тип double поэтому он точно соответствует шаблону и не шаблону. В таком случае нестандартная функция будет предпочтительной в соответствии с [over.best.match] в стандарте:

... F1 определен как лучшая функция, чем... F2 если... F1 не является специализированной функцией шаблона, а F2 - специализированной функцией шаблона...

Если вы вызвали square с аргументом int или float, шаблон снова даст точное совпадение, но вам понадобится преобразование или продвижение для не-шаблона. Шаблон будет выбран, так как он лучше соответствует.

1

Поскольку синтаксис вызова соответствует функции без шаблона, поэтому он будет вызываться

Ещё вопросы

Сообщество Overcoder
Наверх
Меню