Проблема может иметь смысл с более простым примером.Попробуйте определить проблему здесь:
template <typename T>
struct id { typedef T type; };
template <typename T>
void foo(typename id<T>::type x);
foo(5); // error
Проблема в том, что компилятор не может определить, каким должен быть T
;он напрямую нигде не используется.Вы должны явно указать это: foo<int>(5)
, или позволить ему сделать вывод другим способом:
template <typename T>
void foo(typename id<T>::type x, T y);
foo(5, 7); // okay, T is int because 7 is int
Это имеет смысл: как компилятор может определить, какие T
поставленыid
, результат в id<T>::type
совпадении?Могут быть специализации, и все это будет в любом случае дорогостоящим, если это возможно.
Аналогично, нет ничего, что компилятор мог бы вывести R
и Args
.Вместо этого вы должны сделать следующее:
template < typename R, typename ...Args >
typename CallbackBase< R, Args... >::CallbackBasePtr
MakeCallback( R cb(Args...) )
{
typename CallbackBase< R, Args... >::CallbackBasePtr
p( new FunctionCallback< R, Args... >( cb ));
return p;
}
Наконец, у вас есть другие незначительные проблемы, которые необходимо исправить, , которые Xeo обрисовал в общих чертах .