【问题标题】:typedef function is not a type name?typedef 函数不是类型名吗?
【发布时间】:2016-08-13 06:47:09
【问题描述】:

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

【问题讨论】:

标签: c++ function types header std


【解决方案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】:

    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;
    

    【讨论】:

    • 好的。但是一旦我得到std::multiset&lt;MyObject, MyObjectComp&gt; MyObjectMultiSet;,我从哪里开始“插入”到这个列表中?我应该先初始化它吗?我做不到MyObjectMultiSet.insert(elem) :(
    • @paizza 它会给你一个错误吗?如果有什么错误?你可能想问一个新问题来解决这个问题,因为它会得到更多的关注。
    【解决方案3】:

    是的MyObjectComp 不是类型,它是函数。

    对于这种情况,您可以使用函数指针类型指定模板参数,并将MyObjectComp 作为std::multiset 的ctor 的参数传递。

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

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 2021-09-16
      • 1970-01-01
      • 2011-04-10
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      相关资源
      最近更新 更多