包含<algorithm>后,无法解析std :: max

sha*_*ton 2 c++ c++-standard-library c++11

我正在尝试为竞争性编程竞赛编写自己的库,我需要这样的代码:

#include <functional>
#include <algorithm>

template <typename T>
using binop = std::function<T (T, T)>;

int main()
{
    binop<int> op = std::max<int>;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它产生以下错误:

error: conversion from '<unresolved overloaded function type>' to non-scalar type 'binop<int> {aka std::function<int(int, int)>}' requested
Run Code Online (Sandbox Code Playgroud)

但是当我删除该行

#include <algorithm>
Run Code Online (Sandbox Code Playgroud)

它神奇地编译.(虽然不应该确实定义了最大函数)

问题是:如何在不删除"算法"的情况下编译代码?

请注意,我也试过这个:

binop<int> op = (int(*)(int, int)) std::max<int>;
Run Code Online (Sandbox Code Playgroud)

哪个产生

error: insufficient contextual information to determine type
Run Code Online (Sandbox Code Playgroud)

Cur*_*ous 6

这是因为同一功能有多个重载.这不起作用,因为这不起作用

void foo() {}
void foo(int) {}
void foo(double) {}

int main() {
    auto foo_ptr = &foo;
}
Run Code Online (Sandbox Code Playgroud)

要使代码工作,您必须将函数指针强制转换为正确的类型,以告诉编译器您指的是哪个重载

#include <algorithm>

template <typename T>
using Func_t = std::function<T(T, T)>;

int main() {
    template <typename T>
    using MaxOverload_t = const T& (*) (const T&, const T&);

    auto f1 = static_cast<MaxOverload_t<int>>(&std::max<int>);
    auto f2 = Func_t<int>{static_cast<MaxOverload_t<int>>(&std::max<int>)};
}
Run Code Online (Sandbox Code Playgroud)