typedef 函数不是类型名称

typedef function is not a type name?

本文关键字:类型 函数 typedef      更新时间:2023-10-16

这是我在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不是类型名称。我应该把它放在哪里?

std::multiset的模板参数需要一个类型,MyObjectComp 不是类型,而是一个函数名称。 您可以使用decltype来获取其类型,例如

typedef std::multiset<MyObject, decltype(MyObjectComp)*> MyObjectMultiSet;

或者您可以自己指定类型,例如

typedef std::multiset<MyObject, bool(*)(const MyObject&, const MyObject&)> MyObjectMultiSet;

另请注意,通常函子/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以避免该问题:

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;