无法将unique_ptr<derived>转换为unique_ptr<base>



有三个类:

decoder_mqtt-通用解码器

subdecoder_mqtt_base-每个具体版本的基本子解码器(不是抽象类,但有虚拟方法(。

subdecoder_mqtt_v5 : subdecoder_mqtt_base-派生自subdecoder_mqtt_base子解码器类。

decoder_mqtt创建一个子解码器:

// file: mqtt.cc
#include "mqtt_v5.h"
...
using subdecoder_ptr = std::unique_ptr<subdecoder_mqtt_base>;
...
decoder_base::result_t decoder_mqtt::decode_data(const char* data, size_t length)
{
return subdecoder_put_data<subdecoder_mqtt_v5>(
data, length, SUBDECODERS_STATE::V5_REJECTED, _sd_mqtt_v5 );
}
...
template <class SUBDECODER_T>
decoder_base::result_t decoder_mqtt::subdecoder_put_data(
const char* data, size_t length,
SUBDECODERS_STATE sd_state_if_rejected, subdecoder_ptr& subdecoder)
{
if (!(to_underlying(sd_state_if_rejected) & _subdecoders_state))
{
if (!subdecoder)
subdecoder = std::make_unique<SUBDECODER_T>(this); // Error here!
result_t res = subdecoder->reassemble_and_decode_data(data, length);
if (!res)
{
_subdecoders_state |= to_underlying(sd_state_if_rejected);
subdecoder = nullptr;
}
return res;
}
return result_t(false, 0);
}

subdecoder_mqtt_v5:的定义

class subdecoder_mqtt_v5 : subdecoder_mqtt_base
{
public:
subdecoder_mqtt_v5(decoder_mqtt* d_mqtt);
virtual ~subdecoder_mqtt_v5();
virtual result_t reassemble_and_decode_data(const char* data, size_t length) override final;
....
};

GCC打印错误:

error: no match for ‘operator=’ (operand types are ‘decoder_mqtt::subdecoder_ptr’ {aka ‘std::unique_ptr<subdecoder_mqtt_base>’} and ‘std::_MakeUniq<subdecoder_mqtt_v5>::__single_object’ {aka ‘std::unique_ptr<subdecoder_mqtt_v5, std::default_delete<subdecoder_mqtt_v5> >’})
/usr/include/c++/9/bits/unique_ptr.h:305:7: note: candidate: ‘std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = subdecoder_mqtt_base; _Dp = std::default_delete<subdecoder_mqtt_base>]’
305 |       operator=(unique_ptr&& __u) noexcept
|       ^~~~~~~~
/usr/include/c++/9/bits/unique_ptr.h:305:30: note:   no known conversion for argument 1 from ‘std::_MakeUniq<subdecoder_mqtt_v5>::__single_object’ {aka ‘std::unique_ptr<subdecoder_mqtt_v5, std::default_delete<subdecoder_mqtt_v5> >’} to ‘std::unique_ptr<subdecoder_mqtt_base>&&’
305 |       operator=(unique_ptr&& __u) noexcept

我做错了什么?在其他地方,也会编译类似的代码。

我做错了什么?

subdecoder_mqtt_v5私有地派生自subdecoder_mqtt_base,因此在subdecoder_mqtt_v5的成员和朋友中只有指针的隐式转换。unique_ptr构造函数不是其中之一。

你可能打算公开继承:

class subdecoder_mqtt_v5 : public subdecoder_mqtt_base

最新更新