Auto return 模板类型和歧义
Auto return type of template and ambiguity
我有一个重载的模板函数:
template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
如果我这样称呼它:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
一切正常,但是
auto c = overMax<int>(4, 7.2); // error
导致调用不明确。
为什么 int 是这样,还有哪些其他类型?
RT
是不可推导的,所以不提供时,只能调用template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
。
当您(部分)提供一个模板参数时,两种方法都可行,
但根据论点,一个人可能是更好的候选人:
对于auto b = overMax<double>(4, 7.2); // uses second template
overMax<double, int, double>
和 overMax<double, double>
都可行。
但是 overMax<double, int, double>
是完全匹配
而 overMax<double, double>
需要 int
到 double
转换。
对于auto c = overMax<int>(4, 7.2); // Ambiguous call
overMax<int, int, double>
和 overMax<int, double>
都可行。
但两者都不是更好的匹配或更专业的,所以调用是模棱两可的。
我有一个重载的模板函数:
template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
如果我这样称呼它:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
一切正常,但是
auto c = overMax<int>(4, 7.2); // error
导致调用不明确。
为什么 int 是这样,还有哪些其他类型?
RT
是不可推导的,所以不提供时,只能调用template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
。
当您(部分)提供一个模板参数时,两种方法都可行,
但根据论点,一个人可能是更好的候选人:
对于
auto b = overMax<double>(4, 7.2); // uses second template
overMax<double, int, double>
和overMax<double, double>
都可行。
但是overMax<double, int, double>
是完全匹配
而overMax<double, double>
需要int
到double
转换。对于
auto c = overMax<int>(4, 7.2); // Ambiguous call
overMax<int, int, double>
和overMax<int, double>
都可行。
但两者都不是更好的匹配或更专业的,所以调用是模棱两可的。