2016-04-20 93 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); 
相關問題