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);