为什么编译器无法用文字确定std :: max的模板?

时间:2014-11-18 21:05:18

标签: c++ templates stl compiler-errors overloading

既没有铿锵也没有gcc,请编译:

#include <algorithm>
int main()
{
  size_t t = 1;
  t = std::max(t,0);
}

给出一些风味错误:

error: no matching function for call to 'max(size_t&,int)'
... note:   template argument deduction/substitution failed:

如果我明确提供模板类型,它可以工作:

#include <algorithm>
int main()
{
  size_t t = 1;
  t = std::max<size_t>(t,0);
}

令人困惑的是,如果我将size_t0进行比较,那么编译器都不会抱怨警告,就像我将size_tint进行比较一样。然后我推断编译器可以发现将0size_t进行比较是有意义的,那么是什么阻止编译器找出要使用的max

2 个答案:

答案 0 :(得分:5)

std::max只有一个模板参数,用于两个参数。当你在没有明确指定那个参数的情况下调用函数时,它会尝试从两个参数中推导出它,最后用size_t进行一次推导,int用于另一个(因为那些是两个参数的类型)并且不知道你想要哪一个。

非常确定Clang在您切断的地方之后的错误消息部分说明了这一点。

答案 1 :(得分:0)

litwral属于int类型。模板匹配(T,T)不会进行转换。