为什么编译器不能推导出这个简单函数的模板参数?

Rob*_*son 2 c++ templates

这是一个非常简单的模板问题(我认为对C++专家来说很简单),涉及制作通用数学函数.我有一个简单的Epsilon函数,如下所示:

template<class T>
static T Epsilon()
{
    return std::numeric_limits<T>::Min();
}
Run Code Online (Sandbox Code Playgroud)

我想将它分配给一些变量,如下所示:

float epsilon = Math::Epsilon();
Run Code Online (Sandbox Code Playgroud)

,唉,我收到编译错误:

错误C2783:'T Math :: Epsilon(void)':无法推断'T'的模板参数

我可以像这样分配它,没有错误:

float epsilon = Math::Epsilon<float>();
Run Code Online (Sandbox Code Playgroud)

我以为模板引擎能够看到我的T是"浮动",但显然它不能.我在这里没有理解什么?

Mat*_* M. 9

问题是C++没有完整的Hindley-Milner演绎算法.相反,它从函数参数中推导出模板参数.

您的函数没有参数,因此无法推导出模板参数.