作者:蔡俊纬雅雯 | 来源:互联网 | 2022-12-03 17:18
让我用下面的例子说明我的问题.假设我们有一个基类,它定义了一个方法Exec,它接受任何类型(模板)的一个参数.方法Exec调用then方法调用已经重载的方法,将带有不同参数的std :: function对象作为参数.
现在假设我们有一个派生类,它在Base之后继承并重载Exec,因此它将另一个std :: function对象(具有不同的参数集)作为参数.
就像是:
struct Base
{
template
static void Exec( Func func )
{
Call( func );
}
static void Call( std::function func )
{
func();
}
/*other definitions of Call for other std::functions*/
};
struct Derived : public Base
{
using Base::Exec;
static void Exec( std::function func )
{
func( 10 );
}
};
现在假设我们要打电话:
Derived::Exec( []( int i ){std::cout <
这将产生以下编译错误(我尝试使用g ++ 4.8.5和8.1.1):
error: no matching function for call to 'Base::Call(main(int, char**)::&)'
我的问题是:为什么编译器看不到Exec
Derived class(void Derived::Exec( std::function func )
)中的定义?我希望在重载解析期间Derived::Exec
选择,因为它最适合给定的参数:
[]( int i ){std::cout <
我错过了什么?
1> Vittorio Rom..:
Lambda表达式生成具有匿名和唯一类型的闭包.这些类型完全不相关.std::function
你template
是一个更好的匹配,因为它可以推断闭合的确切类型.调用非template
重载将需要std::function
从闭包创建实例(不是完全匹配).