这是我在myCode.h
内的代码:
#include <set>
using namespace std;
bool MyObjectComp(const MyObject& lhs, const MyObject& rhs) {
return lhs.mTick < rhs.mTick;
}
typedef std::multiset<MyObject, MyObjectComp> MyObjectMultiSet;
但它说函数MyObjectComp
不是类型名称。我应该把它放在哪里?
答案 0 :(得分:3)
std::multiset
的模板参数需要一个类型,MyObjectComp
不是一个类型,而是一个函数名。您可以使用decltype
来获取类型
typedef std::multiset<MyObject, decltype(MyObjectComp)*> MyObjectMultiSet;
或者您可以自己指定类型
typedef std::multiset<MyObject, bool(*)(const MyObject&, const MyObject&)> MyObjectMultiSet;
另请注意,一般的functor / lambda比使用函数更有效,因为编译器可以更轻松地优化代码。我建议使用
struct MyObjectComp {
bool operator()(const MyObject& lhs, const MyObject& rhs) {
return lhs.mTick < rhs.mTick;
}
};
typedef std::multiset<MyObject, MyObjectComp> MyObjectMultiSet;
或
auto MyObjectComp = [](const MyObject& lhs, const MyObject& rhs) {
return lhs.mTick < rhs.mTick;
};
typedef std::multiset<MyObject, decltype(MyObjectComp)> MyObjectMultiSet;
答案 1 :(得分:1)
模板参数应该是一个类型,这就是编译错误的原因。这就是您应该如何定义MyObjectComp
以避免该问题:
struct MyObjectComp {
bool operator()(const MyObject& lhs, const MyObject& rhs) {
return lhs.mTick < rhs.mTick;
}
}
或者您可以使用lambda:
auto MyObjectComp = []()(const MyObject& lhs, const MyObject& rhs) {
return lhs.mTick < rhs.mTick;
};
typedef std::multiset<MyObject, decltype(MyObjectComp)> MyObjectMultiSet;
答案 2 :(得分:0)
是MyObjectComp
不是类型,它的功能。
对于这种情况,您可以使用函数指针的类型指定模板参数,并将MyObjectComp
作为std::multiset
的ctor的参数传递。
typedef std::multiset<MyObject, decltype(MyObjectComp)*> MyObjectMultiSet;
MyObjectMultiSet s(MyObjectComp);