Приоритет перегрузки между различными шаблонами функций с одинаковым именем

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

Мой код:

template<typename T>
void f(T t){std::cout << "Template 1" << std::endl;} // template 1

template<typename T, typename B>
void f(T t){std::cout << "Template 2" << std::endl;} // template 2

int main () {
   f(1);  // line 1, template 1 will be called
   f<int>(1);  // template 1 will be called
   f<int,int>(1);  // template 2 will be called
}

Какова возможная причина того, что функция шаблона 1 вызывается в строке 1? Это хорошо определено в спецификации?

В строке 1 я думаю, что компилятор должен выдать ошибку «неоднозначной перегрузки».

7 голосов | спросил Zhongkun Ma 11 ThuEurope/Moscow2014-12-11T12:56:29+03:00Europe/Moscow12bEurope/MoscowThu, 11 Dec 2014 12:56:29 +0300 2014, 12:56:29

1 ответ


0

B не может быть выведено (ни у одного параметра нет типа B), поэтому шаблон 1 является единственной возможной перегрузкой.

ответил rightfold 11 ThuEurope/Moscow2014-12-11T13:00:01+03:00Europe/Moscow12bEurope/MoscowThu, 11 Dec 2014 13:00:01 +0300 2014, 13:00:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132