У вас будет разрешение перегрузки, которое предпочтительнее первого min
для первого случая. Он принимает оба аргумента с точным соответствием, в то время как второй min
нуждается в преобразовании в базовое преобразование для принятия аргументов.
Как вы впоследствии выяснили (экспериментально?), Если вы будете использовать container<...>
в качестве типов аргументов вместо производных классов, это больше не будет нуждаться в преобразовании из производной в базовую, а для разрешения перегрузки предпочтительнее будет второе шаблон, потому что в противном случае оба они одинаково хорошо принимают аргументы, но второй шаблон (в вашем собственном решении) более специализирован.
Тем не менее, в вашем собственном решении вам нужно поставить typename
перед типом возврата, чтобы сделать решение стандартным C ++. Я думаю, что проблема, которая заставляет вас определять второй шаблон, состоит в том, что для того, чтобы сделать шаблон более специализированным, первый min min
должен принять все аргументы, которые принимает второй шаблон, что выясняется путем простой попытки сопоставить аргументы второго шаблона с первым
container<N, T, VT1> -> T // func param 1
container<N, T, VT2> -> T // func param 2
Таким образом, различные типы параметров шаблона пытаются определить один и тот же параметр шаблона, что приведет к конфликту и приведет к тому, что первый шаблон не сможет успешно вывести все аргументы второго шаблона. Для вашего собственного решения это не будет иметь место:
container<N, T, VT> -> T // func param 1
container<N, T, VT> -> T // func param 2
Это заставит первый шаблон выводить все типы параметров из второго шаблона, но не наоборот: container<N, T, VT>
не будет совпадать с произвольным T
. Таким образом, шаблон вашего собственного решения является более специализированным и вызывается, а затем явно пересылается на другой шаблон.
Наконец, обратите внимание, что ваше собственное решение принимает только контейнеры, в которых третий аргумент шаблона совпадает, в то время как ваш другой шаблон min
принимает контейнеры, в которых этот аргумент может отличаться для обоих аргументов функции. Я не уверен, намеренно ли это, но учитывая наличие другой функции min
, которая конфликтует, если вы не сделаете третий тип аргумента таким же, как показано выше, я не уверен, как это исправить иначе.
Спрашивающий впоследствии отредактировал свой собственный ответ, поэтому большинство моих ссылок выше на «ваш собственный ответ» больше не применяются.