std::set 作为 class 成员不能使用函数指针作为 key_comp
std::set as a class member can't use function pointer as key_comp
我想定义一个 class 成员 std::set,函数指针为 key_comp,但编译器报告“不是类型”。
bool compare(unsigned v1, unsigned v2)
{
...
}
std::set<unsigned, decltype(compare)*> GoodSet(compare);
class BadSet{
public:
...
std::set<unsigned, decltype<compare>*> Set2(compare);
};
int main()
{
BadSet S;
return 0;
}
GoodSet 编译正常,但 GNU C++ 在 BadSet 报告:“compare is not a type”。
我的系统是 windows 10 + WSL 2.0 + ubuntu 20.04.
您不能像您尝试的那样使用父 class 声明中的括号将参数传递给成员的构造函数。您需要
- 使用父class构造函数的成员初始化列表:
class BadSet{
public:
...
std::set<unsigned, decltype<compare>*> Set2;
BadSet() : Set2(compare) {}
...
};
- 通过等式初始化器使用 list-initialization:
using myset = std::set<unsigned, decltype<compare>*>;
class BadSet{
public:
...
myset Set2 = myset{compare};
or
myset Set2 = myset(compare);
...
};
- 或大括号初始值设定项:
class BadSet{
public:
...
std::set<unsigned, decltype<compare>*> Set2{compare};
...
};
有关详细信息,请参阅 Non-static data members。
另见 Using custom std::set comparator
我想定义一个 class 成员 std::set,函数指针为 key_comp,但编译器报告“不是类型”。
bool compare(unsigned v1, unsigned v2)
{
...
}
std::set<unsigned, decltype(compare)*> GoodSet(compare);
class BadSet{
public:
...
std::set<unsigned, decltype<compare>*> Set2(compare);
};
int main()
{
BadSet S;
return 0;
}
GoodSet 编译正常,但 GNU C++ 在 BadSet 报告:“compare is not a type”。 我的系统是 windows 10 + WSL 2.0 + ubuntu 20.04.
您不能像您尝试的那样使用父 class 声明中的括号将参数传递给成员的构造函数。您需要
- 使用父class构造函数的成员初始化列表:
class BadSet{
public:
...
std::set<unsigned, decltype<compare>*> Set2;
BadSet() : Set2(compare) {}
...
};
- 通过等式初始化器使用 list-initialization:
using myset = std::set<unsigned, decltype<compare>*>;
class BadSet{
public:
...
myset Set2 = myset{compare};
or
myset Set2 = myset(compare);
...
};
- 或大括号初始值设定项:
class BadSet{
public:
...
std::set<unsigned, decltype<compare>*> Set2{compare};
...
};
有关详细信息,请参阅 Non-static data members。
另见 Using custom std::set comparator