gpt4 book ai didi

C++ 派生类重载函数(带有 std::function 参数)不可见

转载 作者:太空狗 更新时间:2023-10-29 23:48:48 25 4
gpt4 key购买 nike

让我用下面的例子来说明我的问题。假设我们有一个基类,它定义了方法 Exec,该方法采用任何类型(模板)的一个参数。方法 Exec 调用然后方法 Call 已重载以将具有不同参数的 std::function 对象作为参数。

现在假设我们有一个继承自 Base 并重载 Exec 的派生类,因此它需要另一个 std::function 对象(具有不同的参数集)作为参数.

类似于:

struct Base
{
template<typename Func>
static void Exec( Func func )
{
Call( func );
}

static void Call( std::function<void(void)> func )
{
func();
}

/*other definitions of Call for other std::functions*/
};

struct Derived : public Base
{
using Base::Exec;

static void Exec( std::function<void(int)> func )
{
func( 10 );
}
};

现在假设我们要调用:

Derived::Exec( []( int i ){std::cout << i << std::endl;} );

这将给出以下编译错误(我尝试使用 g++ 4.8.5 和 8.1.1):

error: no matching function for call to 'Base::Call(main(int, char**)::<lambda(int)>&)'

我的问题是:为什么编译器看不到 Exec 的定义?在派生类(void Derived::Exec( std::function<void(int)> func ))?我希望在重载解析期间 Derived::Exec将被选中,因为它最适合给定的论点:

 []( int i ){std::cout << i << std::endl;}

我错过了什么?

最佳答案

Lambda 表达式 生成具有匿名唯一 类型的闭包。这些类型与 std::function 完全无关。

您的模板 更匹配,因为它可以推断出闭包 的确切类型。调用非模板 重载需要从闭包 创建一个std::function 实例(不是完全匹配)。

关于C++ 派生类重载函数(带有 std::function 参数)不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com