2016-03-03 3 views
2

У меня возникли трудности с использованием std::placeholders в моей функции, которая принимает вариационный шаблон. Я начинаю думать, что мне не нужно использовать вариационный шаблон, но я так долго пробовал это, я думаю о сорняках и нуждаюсь в том, чтобы кто-то с новым взглядом.Использование std :: placeholders в вариативных шаблонах

Следующая шаблонная функция принимает обычный шаблонный аргумент, а затем переменный аргумент. Это вызывает ошибку компиляции:

registerEvent<UpdaterComponent, std::_Ph<1>>(EVT_INIT, &UpdaterComponent::initialise, std::placeholders::_1); 

Ошибка компилятора:

Error 1 error C2664: 'Status Component::registerEvent>(const int &,Status UpdaterComponent::* (__cdecl )(const EventArgs &),std::_Ph<1>)' : cannot convert argument 2 from 'Status (__thiscall UpdaterComponent::)(const EventArgs &)' to 'Status UpdaterComponent::* (__cdecl *)(const EventArgs &)'

Что именно происходит здесь не так, и как я могу исправить эту ошибку компилятора?

// In class Component 
template<typename T, typename... Params> 
Status registerEvent(int evtId, Status T::*func(const EventArgs& evtArgs), Params...) 
{ 
    ... irrelevant code removed for brevity 

    auto res = std::bind(func, this, Params...); 

    ... irrelevant code removed for brevity 
} 


// Usage 
class UpdaterComponent : public Component 
{ 
public: 
    UpdaterComponent() 
    { 
     registerEvent<UpdaterComponent, std::_Ph<1>>(EVT_INIT, &UpdaterComponent::initialise, std::placeholders::_1); 
    } 
}; 
+0

Можете ли вы показать 'UpdaterComponent :: initialize'? – melak47

+0

Кроме того, 'Status T :: * func (const EventArgs & evtArgs)', вероятно, должен быть 'Status (T :: * func) (const EventArgs & evtArgs)' – melak47

ответ

2

Основная проблема заключается в том, что вы недостающие скобки:

template<typename T, typename... Params> 
Status registerEvent(int evtId, Status (T::*func)(const EventArgs& evtArgs), Params...) 
             ^^^  ^^^ 

Таким образом, вы в конечном итоге получить тип func неправильно.

Как только вы это исправите, почему вы явно предоставляете все параметры шаблона? Для этого нужен шаблонный вывод! И когда вы набираете std::_Ph, не надо. Этого достаточно:

registerEvent(EVT_INIT, &UpdaterComponent::initialise, std::placeholders::_1); 
+0

спасибо за ваш ответ. Почему я явно предоставляю все параметры шаблона? Я не уверен, где в коде, на который вы ссылаетесь. Вы имеете в виду реализацию параметров 'Component :: registerEvent()' или использование параметров шаблона этой функции? –

+0

@JakeM Вы явно вызываете 'registerEvent >'. Вам не нужно это делать. Вы можете просто вызвать 'registerEvent'. – Barry

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