函数不能在模板实例中推导出重载类型

std::function cannot deduce overloaded type in template instance

本文关键字:重载 类型 实例 不能 函数      更新时间:2023-10-16

我有一个相当简单的模板类:

template <typename Value>
struct Foo {
    typedef Value ValueType;
    Value array[3];
};

现在我试图从一个简单的函数获得一个函数对象(std::function),使用F的依赖类型作为函数参数和返回类型。

template <typename F>
void floorfunc(const F& foo) {
    typedef typename F::ValueType Value;
    auto fptr = std::function<Value(Value)>(std::floor);
}

编译器正确地实例化了Value类型,但是没有猜出floor的正确的函数过载,并且给我这个错误消息

error: no matching function for call to 'std::function<float(float)>::function(<unresolved overloaded function type>

我如何告诉编译器在这种情况下需要使用重载?

添加cast:

std::function<Value(Value)>(static_cast<Value(&)(Value)>(std::floor))

std::floor是重载的,而std::function的构造函数是一个模板,因此没有明显的重载选择,您必须显式指定它,这可以通过强制转换来实现。