基类是:
#include <memory>
namespace cb{
template< typename R, typename ... Args >
class CallbackBase
{
public:
typedef std::shared_ptr< CallbackBase< R, Args... > >
CallbackPtr;
virtual ~CallbackBase()
{
}
virtual R Call( Args ... args) = 0;
};
} // namespace cb
派生类是这样的:
namespace cb{
template< typename R, typename ... Args >
class FunctionCallback : public CallbackBase< R, Args... >
{
public:
typedef R (*funccb)(Args...);
FunctionCallback( funccb cb_ ) :
CallbackBase< R, Args... >(),
cb( cb_ )
{
}
virtual ~FunctionCallback()
{
}
virtual R Call(Args... args)
{
return cb( args... );
}
private:
funccb cb;
};
} // namespace cb
创建函数:
namespace cb{
template < typename R, typename ...Args >
typename CallbackBase< R, Args... >::CallbackBasePtr
MakeCallback( typename FunctionCallback< R, Args... >::funccb cb )
{
typename CallbackBase< R, Args... >::CallbackBasePtr
p( new FunctionCallback< R, Args... >( cb )
);
return p;
}
} // namespace cb
例子:
bool Foo_1args( const int & t)
{
return true;
}
int main()
{
auto cbObj = cb::MakeCallback( & Foo_1args );
}
我一直收到这个错误:
error: no matching function for call to ‘MakeCallback(bool (*)(const int&))’
error: unable to deduce ‘auto’ from ‘<expression error>’
我试图更改它,但我不知道如何修复。
那么,有什么问题吗?以及如何修复此示例?
最佳答案
这个问题用一个更简单的例子可能更有意义。尝试在此处确定问题:
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;
}
最后,您还有其他需要修复的小问题,which Xeo has outlined .
关于c++ - 这个可变参数模板示例有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656691/