声明并定义自定义std::set comparator



我有一个由std::set组成的类,声明为

std::set<customPair, decltype(comp)> mySet;

具有(在类外定义(,

bool comp (customPair a, customPair b) { return a.first >= b.first}

和,

typedef std::pair<int, int> customPair;

因此,在我的class声明中,我使用声明mySet

class Example:
public:
std::set<customPair, decltype(comp)> mySet;

当我在我的构造函数中写入(即定义(它时

Example::Example(){
mySet(comp);
}

我得到以下错误:

.../stl_tree.h:880:7 error: function  returning a function
key_comp() const

我想知道为什么:

std::set<customPair, decltype(comp)> mySet(comp);

例如,在任何方法中动态声明时都有效,但在我的情况下(在类内(失败了吗?

decltype(comp)的类型是函数,但std::set比较器需要是函数指针或函子。更改为decltype(&comp)修复了编译问题。

您还需要将函数指针的一个实例传递给std::set构造函数,否则它将为null,并在尝试添加元素时崩溃。您可以在每个构造函数的初始化程序列表中执行此操作:

Example()
:mySet(&comp)
{
}

或者当您声明成员时直接在类中:

std::set<customPair, decltype(&comp)> mySet{&comp};

请注意,由于mySet(&comp)中c++的特殊性,您可以只使用mySet(comp),并且comp会自动转换为函数指针,这与decltype中不进行转换的情况不同。

最新更新