2015-03-01 4 views
-1

класс геймобжекты .h + .cpp:Инициализация станд :: функция не принимает значение функции принимает 3 аргумента

typedef std::function<void(GameObject* triggerobject, GameObject* otherobject, TriggerAction action)> PhysicsCallback; 

    void GameObject::OnTrigger(GameObject* triggerobject, GameObject* otherobject, TriggerAction action) 
    { 
     if (m_OnTriggerCallback) 
      m_OnTriggerCallback(triggerobject, otherobject, action); 
    } 

    void GameObject::SetOnTriggerCallBack(PhysicsCallback callback) 
    { 
     m_OnTriggerCallback = callback; 
    } 

Другой класс:

m_pSphere->SetOnTriggerCallBack(*pCbObj); 
m_pSphere->OnTrigger(m_pWallLeft, m_pSphere, GameObject::TriggerAction(0)); 

Я полагал использовать OnTrigger () мне пришлось установить m_OnTriggerCallback. Когда я попытался передать соответствующие аргументы, я действительно застрял. Кажется почти невозможным инициализировать PhysicsCallback без ошибок компилятора.

Я пробовал: std::function<void(GameObject* triggerobject, GameObject* otherobject, GameObject::TriggerAction action)> *obj; *obj = (m_pWallRight, m_pSphere, GameObject::TriggerAction(0));

но не повезло. * obj не принимает никаких аргументов. Эти следующие строки дают одни и те же ошибки:

GameObject::PhysicsCallback *pCbObj; = new GameObject::PhysicsCallback(new std::function<void()>()); //term does not evaluate to a function taking 3 arguments 
    GameObject::PhysicsCallback *pCbObj = new GameObject::PhysicsCallback((m_pWallRight, m_pSphere, GameObject::TriggerAction(0))); 

И эта линия *pCbObj = GameObject::PhysicsCallback(m_pWallRight, m_pSphere, GameObject::TriggerAction(0)); дает эту ошибку IntelliSense: http://puu.sh/gi29n/95f0f7855b.png

Я действительно путают, как использовать функцию SetOnTriggerCallBack?

+0

Вы должны добавить прототип 'геймобжекты :: TriggerAction' здесь. – Telokis

+0

'std :: function' должен быть инициализирован некоторым * вызываемым *, то, что может быть вызвано, как если бы это была функция. Ваш вызываемый должен быть функцией, функтором ... что-то, что принимает аргументы типов 'GameObject *, GameObject *, TriggerAction' и возвращает' void'. Вы пытаетесь создать 'PhysicsCallback' с этим выражением' (m_pWallRight, m_pSphere, GameObject :: TriggerAction (0)) ', который не является вызываемым. И что это - 'PhysicsCallback (new std :: function ())'. Ошибки Intellisense не имеют большого значения, вы должны скопировать-вставить сообщения об ошибках, которые производит компилятор. – Praetorian

+0

Это соответствующее сообщение об ошибке компилятора: 'std :: function :: function': ни один из 10 перегрузок не смог преобразовать все типы аргументов – Eiron

ответ

0

С лямбда я был в состоянии создать параметр, который является приемлемым для компилятора:

GameObject::PhysicsCallback trigger = [=](GameObject* triggerobject, GameObject* otherobject, GameObject::TriggerAction action){}; 
0

Ведение

m_pSphere->OnTrigger(m_pWallLeft, m_pSphere, GameObject::TriggerAction(0)); 

фактически вызывая GameObject::TriggerAction с 0 в качестве аргумента. Затем он передает свой результат.

Что такое GameObject::TriggerAction? Это статический метод? Это должно быть потому, что в противном случае у вас есть либо std::bind, либо object instance, либо применить его напрямую.

+0

TriggerAction - это Enum , ничего особенного в этом нет. Он отлично работает в качестве аргумента в других вызовах функций. – Eiron

+0

Что такое 'pCbObj' в' m_pSphere-> SetOnTriggerCallBack (* pCbObj); '? Это может помочь нам разобраться. – Telokis

+0

pCbObj - это указатель PhysicsCallback (object?), Который я пытаюсь передать в качестве аргумента. Я не очень хорош в названиях и определениях. Если бы было возможно, я бы передал 3 аргумента m_pWallRight, m_pSphere, GameObject :: TriggerAction (0), но компилятор начинает жаловаться, потому что я не знаю, как их расплавить в std :: function как один аргумент – Eiron

Смежные вопросы