std::function 无法推断模板实例中的重载类型

std::function cannot deduce overloaded type in template instance

我有这个相当简单的模板 class :

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

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

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>

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

添加演员:

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

std::floor 被重载,而 std::function 的构造函数是一个模板,所以没有明显的重载选择,你必须明确指定它,你可以用强制转换来完成。