2016-04-20 65 views
1

这是我的内myCode.h代码:typedef函数不是类型名称吗?

#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不是一个类型的名字。我应该在哪里放置它?

+0

可能的复制[使用定制的std ::设置比较](http://stackoverflow.com/questions/2620862/using-custom-stdset-comparator) – ashiquzzaman33

回答

3

std::multiset模板参数需要一个类型,MyObjectComp不是一个类型,而是代替一个函数名称。您可以使用decltype来获得它的类型像

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

或者你也可以自己指定类型像

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

还要注意一般是仿函数/λ比使用功能的编译器比较有效可以更轻松地优化代码。我会建议使用

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; 
+0

确定。但是,一旦我得到了'std :: multiset MyObjectMultiSet;',我该从哪里开始“插入”到这个列表?我应该先启动它吗?我不能做'MyObjectMultiSet.insert(elem)':( – markzzz

+0

@paizza它是否会给你一个错误?如果是的话会出现什么错误?你可能想问一个新的问题,但是要解决这个问题,因为它会得到更多的关注 – NathanOliver

+0

它现在似乎有用!谢谢! – markzzz

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

MyObjectComp不是类型,它的功能。

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

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