2016-04-20 1 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

Возможный дубликат [Использование пользовательских зЬй :: установить компаратор] (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

Ok. Но как только я получил '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; 
    } 
} 

или вы могли бы использовать лямбда:

auto MyObjectComp = []()(const MyObject& lhs, const MyObject& rhs) { 
    return lhs.mTick < rhs.mTick; 
}; 

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

Да MyObjectComp не тип, это функция.

В этом случае вы можете указать аргумент шаблона с указателем функции и передать MyObjectComp в качестве аргумента ctor std::multiset.

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