#include <utility>
class Base {
public:
virtual ~Base() {}
virtual void base() {}
};
class Derived : public Base {
public:
virtual void derived() {}
};
template<typename... Params>
using MemberFuncPtr = void(Derived::*)(Params...);
template<typename... Params, typename... Args>
void wrapper(MemberFuncPtr<Params...> ptr, Args&&... args)
{
Derived* d = new Derived();
(d->*ptr)(std::forward<Args>(args)...);
delete d;
}
int main()
{
wrapper(&Derived::derived);
wrapper(&Derived::base);
return 0;
}
Попытка запустить этот код (GCC 7.0) дает мне следующую ошибку:параметр шаблона принимать указатель на функцию-член класса
prog.cc: In function 'int main()':
prog.cc:33:27: error: no matching function for call to 'wrapper(void (Base::*)())'
wrapper(&Derived::base);
^
prog.cc:18:6: note: candidate: template<class ... Params, class ... Args> void wrapper(MemberFuncPtr<Params ...>, Args&& ...)
void wrapper(MemberFuncPtr<Params...> ptr, Args&&... args)
^~~~~~~
prog.cc:18:6: note: template argument deduction/substitution failed:
prog.cc:33:27: note: mismatched types 'Derived' and 'Base'
wrapper(&Derived::base);
^
Я не понимаю, почему метод из базового класса является вопрос? Это также метод для производного класса. Я сделал простой тест, где я назначил Derived::base
на Derived::*ptr
, и это сработало.
То, что я думаю, что я должен помнить о том, что шаблон вычет не допускает преобразования. Благодаря! –