typedef函数不是类型名称?

时间:2016-04-20 14:06:11

标签: c++ function types header std

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

3 个答案:

答案 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);
相关问题