typedef 函数不是类型名?
typedef function is not a type name?
这是我里面的代码 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
不是类型名称。我应该把它放在哪里?
模板参数应该是一个类型,这就是你得到编译错误的原因。这是您应该如何定义 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;
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;
是的 MyObjectComp
不是类型,是函数。
对于这种情况,您可以指定带有函数指针类型的模板参数,并将 MyObjectComp
作为 std::multiset
.
的构造函数的参数传递
typedef std::multiset<MyObject, decltype(MyObjectComp)*> MyObjectMultiSet;
MyObjectMultiSet s(MyObjectComp);
这是我里面的代码 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
不是类型名称。我应该把它放在哪里?
模板参数应该是一个类型,这就是你得到编译错误的原因。这是您应该如何定义 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;
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;
是的 MyObjectComp
不是类型,是函数。
对于这种情况,您可以指定带有函数指针类型的模板参数,并将 MyObjectComp
作为 std::multiset
.
typedef std::multiset<MyObject, decltype(MyObjectComp)*> MyObjectMultiSet;
MyObjectMultiSet s(MyObjectComp);