我已阅读this个问题但对我没有帮助。
我的问题是:为set
的密钥类型使用比较函数时,为什么会出现运行时错误?
multiset<Phone, decltype(comp)*> phones { Phone(911), Phone(112) };
//^^^^^^^^^^^^^^^
在VC2013中,它为我提供了以上代码:
debugit.exe中0x73DECB49处的未处理异常:0xC0000005:访问冲突执行位置0x00000000。
这是一个产生错误的小例子:
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
struct Phone {
Phone(long long const &num) : number{num} {}
long long number;
};
// compare function:
bool comp(Phone const &n1, Phone const &n2) { return n1.number < n2.number; }
int main()
{ // The below line produces the runtime error.
multiset<Phone, decltype(comp)*> phones { Phone(911), Phone(112) };
}
我看不出我在这里做错了什么。我用VC2013和g ++(GCC)4.9.1编译的结果都是相同的。
答案 0 :(得分:2)
decltype(comp)*
只是指向具有签名bool(Phone const&, Phone const&)
的函数的指针。它的值初始化为nullptr
。 std::multiset
的std::initializer_list
构造函数使用此作为Compare
对象的默认参数。由于您已使用空函数指针初始化std::multiset
作为比较器,因此调用它可能会导致段错误。
要解决此问题,请提供Compare
对象的有效实例,如下所示:
multiset<Phone, decltype(comp)*> phones {{ Phone(911), Phone(112)}, &comp};