我下面有简单的示例代码。
#include <iostream>
#include <set>
using namespace std;
class A {
public:
A() = default;
A(int x) : _x(x) {}
int getX() { return _x; }
private:
int _x;
};
bool compare (A x, A y) {
return x.getX()-y.getX();
}
using Less = bool (*)(A, A);
int main() {
set <int> s1 = {1,2,3}; // <-- clause 1 - no issue!
bool (*fnc)(A, A) = compare;
set <A, Less> s2(fnc) = { A(1), A(2) }; // <-- clause 2. Expecting ";" at the end of declaration
return 0;
}
为什么我不能列出初始化子句 2,而子句 1 没有问题?
尝试
template<auto x>
uding val_t=std::integral_constant<decltype(x),x>;
set <A, val_t<compare>> s2 = { A(1), A(2) };
您现有的代码使用函数指针初始化 std set,然后尝试使用初始值设定项列表再次初始化它。您只能初始化一个对象一次。
这里我通过
val_t
类型传递了less函数,所以初始化的时候就不用传入了。