首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std:包含<algorithm>后无法解决最大问题

std:包含<algorithm>后无法解决最大问题
EN

Stack Overflow用户
提问于 2017-06-07 18:50:36
回答 2查看 935关注 0票数 2

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

代码语言:javascript
复制
#include <functional>
#include <algorithm>

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

int main()
{
    binop<int> op = std::max<int>;
}

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

代码语言:javascript
复制
error: conversion from '<unresolved overloaded function type>' to non-scalar type 'binop<int> {aka std::function<int(int, int)>}' requested

但当我把线移开

代码语言:javascript
复制
#include <algorithm>

它神奇地编译。(虽然不应该真正定义一个max函数)

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

请注意,我也尝试过这样做:

代码语言:javascript
复制
binop<int> op = (int(*)(int, int)) std::max<int>;

代码语言:javascript
复制
error: insufficient contextual information to determine type
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-07 18:54:47

这是因为同一个函数有多个重载。这并不完全是因为这个不起作用的原因。

代码语言:javascript
复制
void foo() {}
void foo(int) {}
void foo(double) {}

int main() {
    auto foo_ptr = &foo;
}

要使代码正常工作,您必须将函数指针转换为正确的类型,以告知编译器您所指的重载。

代码语言:javascript
复制
#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>)};
}
票数 6
EN

Stack Overflow用户

发布于 2017-06-07 18:56:28

std::max有多个重载。即使指定模板类型也是不够的。

代码语言:javascript
复制
template< class T > 
const T& max( const T& a, const T& b );

//and

template< class T >
T max( std::initializer_list<T> ilist );

编译器无法决定您想要哪一个。

为了解决这个问题,我们可以使用lambda并将它封装在对max的调用上,如下

代码语言:javascript
复制
binop<int> op = [](const auto& lhs, const auto& rhs){ return std::max(lhs, rhs); };
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44420636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档