Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否隐式转换为std::sort而不是std::map的比较函数对象(函子)?_C++ - Fatal编程技术网

C++ 是否隐式转换为std::sort而不是std::map的比较函数对象(函子)?

C++ 是否隐式转换为std::sort而不是std::map的比较函数对象(函子)?,c++,C++,我一直在使用std::sort函数作为比较函数。函数隐式转换为函子(通过GCC)。我在声明std::map类型时尝试了相同的方法,但失败了 使用g++-Wall-Wextra-std=gnu++14-pedantic: #include <map> #include <algorithm> #include <vector> struct S { int i; }; struct Payload { bool b; }; bool compare(cons

我一直在使用
std::sort
函数作为比较函数。函数隐式转换为函子(通过GCC)。我在声明
std::map
类型时尝试了相同的方法,但失败了

使用
g++-Wall-Wextra-std=gnu++14-pedantic

#include <map>
#include <algorithm>
#include <vector>

struct S { int i; };
struct Payload { bool b; };

bool compare(const S* const& lhs, const S* const& rhs)
{
    return lhs->i < rhs->i;
}

using MyMap = std::map<const S*, Payload, compare>;

static void foo([[maybe_unused]] const MyMap&) {}

int main()
{
    std::vector<const S*> vs;
    std::sort(vs.begin(), vs.end(), compare); // OK

    MyMap m;
    foo(m);
}
#包括
#包括
#包括
结构S{int i;};
结构有效载荷{bool b;};
布尔比较(常量S*常量和左侧、常量S*常量和右侧)
{
返回lhs->ii;
}
使用MyMap=std::map;
静态void foo([[maybe_unused]]const MyMap&){
int main()
{
std::向量vs;
排序(vs.begin(),vs.end(),compare);//确定
MyMap m;
富(m),;
}
这是输出:

main.cpp:13:50: error: type/value mismatch at argument 3 in template parameter list for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
   13 | using MyMap = std::map<const S*, Payload, compare>;
      |                                                  ^
main.cpp:13:50: note:   expected a type, got 'compare'
main.cpp:13:50:错误:“模板类std::map”的模板参数列表中参数3的类型/值不匹配
13 |使用MyMap=std::map;
|                                                  ^
main.cpp:13:50:注意:应该是一个类型,得到“compare”

是否有一种方法可以将函子传递到
映射
声明,而无需手动定义函子类(使用
std::sort
)即可?

您似乎混淆了类型和值。
std::sort
的第三个参数是值,
std::map
的第三个参数是类型

using MyMap = std::map<const S*, Payload, bool (*)(const S* const&, const S* const&)>;

PS在排序示例中没有到函子的隐式转换。作为模板,可以使用任何合法的函数调用运算符调用函数排序。这包括函子和函数指针(除其他外)。

您可以使用
decltype(&compare)
使其更具可读性。后来我发现了类似的问题。
MyMap my_map(compare);