gpt4 book ai didi

c++ - 当 B 继承自 A 时,std::function< void ( const A & )> 不能强制转换为 std::function< void ( const B & ) >

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:50 27 4
gpt4 key购买 nike

我目前正在尝试将一些监听器存储在 std::vector 中,并在需要时调用它们。我在基类中有以下定义:

class A
{
public:
virtual ~A();
typedef std::function< void( const A & ) > Listener;
std::vector< Listener > listeners;
void addListener( const Listener & listener)
{
this->listeners.push_back( listener );
}
}

我有一个简单的 B 类:

class B : public A
{
virtual ~B();
}

我想做的就是能够像这样编写一个调用:

B b;
b.addListener( [] ( const & B ) { /* Do something */ } );

但是编译不通过,报错如下:

error: no viable conversion from '<lambda at main.cpp:158:27>' to 'const Listener' (aka 'const function<void (const A &)>')

我目前正在使用 dynamic_cast 避免这个问题,但这似乎是一件坏事,或者对我来说是一个糟糕的设计......

最佳答案

首先考虑正常功能。只因为AB是相关类型,您可以在它们之间转换,这并不意味着函数的类型 void f(const A&)void g(const B&)是相关的,并且指向这些函数的指针不能相互转换。

同样,SomeTemplate<A>SomeTemplate<B>不是相关类型,不能相互转换。

我希望现在 std::function<void(const A&)> 有意义和 std::function(void(const A&)>是不相关的类型,不能在彼此之间来回转换。

关于c++ - 当 B 继承自 A 时,std::function< void ( const A & )> 不能强制转换为 std::function< void ( const B & ) >,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26219727/

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