Рассмотрите этот код:
#include <iostream>
//Number1
template<typename T1, typename T2>
auto max (T1 a, T2 b)
{
std::cout << "auto max(T1 a, T2 b)" <<std::endl;
return b < a ? a : b;
}
//Number2
template<typename RT, typename T1, typename T2>
RT max (T1 a, T2 b)
{
std::cout << "RT max(T1 a, T2 b)" << std::endl;
return b < a ? a : b;
}
int main()
{
auto a = ::max(4, 7.2); //Select Number1
auto b = ::max<double>(4, 7.4); //Select Number2
auto c = ::max<int>(7, 4.); //Compile-time error overload ambiguous
auto c = ::max<double>(7, 4.); //Select Number2
}
auto c = ::max<int>(7, 4.);
: эта строка не компилируется из-за неоднозначности перегрузки со следующим сообщением:
maxdefault4.cpp:9:27: error: call of overloaded 'max(int, double)' is ambiguous
auto c = ::max<int>(7, 4.);
^
maxdefault4.cpp:9:27: note: candidates are:
In file included from maxdefault4.cpp:1:0:
maxdefault4.hpp:4:6: note: auto max(T1, T2) [with T1 = int; T2 = double]
auto max (T1 a, T2 b)
^
maxdefault4.hpp:11:4: note: RT max(T1, T2) [with RT = int; T1 = int; T2 = double]
RT max (T1 a, T2 b)
^
пока следующий код:
àuto c = ::max<double>(7, 4.)
успешно, почему у нас не появляется одно и то же сообщение об ошибке, в котором говорится, что вызов неоднозначен для max<double>
так же, как и при сбое max<int>
?
Почему для double
нет проблем?
В книге "Шаблоны C++, полное руководство" я читал, что при выводе аргумента шаблона не учитывается тип возвращаемого значения, так почему max<int>
является неоднозначным, а не max<double>
?
Действительно ли возвращаемый тип шаблонной функции не учитывается при вычислении аргумента?