繁体   English   中英

无法转换 unique_ptr<derived> 到 unique_ptr<base></derived>

[英]Cannot convert unique_ptr<derived> to unique_ptr<base>

有3类:

decoder_mqtt - 通用解码器

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

subdecoder_mqtt_v5 subdecoder_mqtt_v5: subdecoder_mqtt_base subdecoder_mqtt_base - 源自subdecoder_mqtt_base子解码器 class。

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

都是因为 inheritance 说明符。 C++ 中的默认值为私有 inheritance。 有必要写:

class subdecoder_mqtt_v5: public subdecoder_mqtt_base...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM