【问题标题】:correct declaration of function in the code snippet below在下面的代码片段中正确声明函数
【发布时间】:2021-12-25 05:09:09
【问题描述】:

编写这些函数 get_m_source() 、 get_m_key() 和 get_m_data() 的正确方法是什么 我尝试了下面的第一种方法,因为返回的是 boost::optional。 但它导致了如下所示的错误-

/home/badri/sandboxes_git/acvs-illustra-global/output/amb_cv22_evk/arm/release/usr/include/boost/optional/optional.hpp: In instantiation of ‘void boost::optional_detail::optional_base<T>::construct(boost::optional_detail::optional_base<T>::argument_type) [with T = tev::events::EventItemCategory; boost::optional_detail::optional_base<T>::argument_type = const tev::events::EventItemCategory&]’:
/home/badri/sandboxes_git/acvs-illustra-global/output/amb_cv22_evk/arm/release/usr/include/boost/optional/optional.hpp:181:18:   required from ‘boost::optional_detail::optional_base<T>::optional_base(const boost::optional_detail::optional_base<T>&) [with T = tev::events::EventItemCategory]’
/home/badri/sandboxes_git/acvs-illustra-global/output/amb_cv22_evk/arm/release/usr/include/boost/optional/optional.hpp:944:5:   required from here
/home/badri/sandboxes_git/acvs-illustra-global/output/amb_cv22_evk/arm/release/usr/include/boost/optional/optional.hpp:384:8: error: use of deleted function ‘tev::events::EventItemCategory::EventItemCategory(const tev::events::EventItemCategory&)’
  384 |        ::new (m_storage.address()) value_type(val) ;
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated due to -Wfatal-errors.

class EventMessage
{
public:
    .
    .
    boost::optional<EventItemCategory> get_m_source() { return m_source; }
    boost::optional<EventItemCategory> get_m_key() { return m_key; }
    boost::optional<EventItemCategory> get_m_data() { return m_data; }

private:
    void                                                                           init();
    boost::optional<EventItemCategory>&            getEventItemCategory( EVENT_ITEM_CATEGORY_TYPE const& type );

    time_t m_timestamp;
    boost::optional<PROPERTY_OPERATION> m_propertyOperation;
    boost::optional<EventItemCategory> m_source;
    boost::optional<EventItemCategory> m_key;
    boost::optional<EventItemCategory> m_data;
    std::map<EVENT_ITEM_CATEGORY_TYPE const, boost::optional<EventItemCategory> & > m_eventItemMap;
};

我尝试了第二种方法,很清楚它不会起作用。正如预期的那样,抛出的错误是 -

./EventMessage.hpp:68:47: error: could not convert ‘((tev::events::EventMessage*)this)->tev::events::EventMessage::m_source’ from ‘boost::optional<tev::events::EventItemCategory>’ to ‘tev::events::EventItemCategory’

class EventMessage
{
public:
    .
    .
    .
    EventItemCategory get_m_source() { return m_source; }
    EventItemCategory get_m_key() { return m_key; }
    EventItemCategory get_m_data() { return m_data; }


private:
    void                                                                           init();
    boost::optional<EventItemCategory>&            getEventItemCategory( EVENT_ITEM_CATEGORY_TYPE const& type );

    time_t m_timestamp;
    boost::optional<PROPERTY_OPERATION> m_propertyOperation;
    boost::optional<EventItemCategory> m_source;
    boost::optional<EventItemCategory> m_key;
    boost::optional<EventItemCategory> m_data;
    std::map<EVENT_ITEM_CATEGORY_TYPE const, boost::optional<EventItemCategory> & > m_eventItemMap;
};

【问题讨论】:

  • 我猜EventItemCategory 不可复制,请出示minimal reproducible example
  • 谢谢艾伦。我会得到一个。
  • 这是您的起点coliru.stacked-crooked.com/a/fb9c0d08f87a541a。只需编辑直到出现错误
  • 通过 MSVP,我收到了额外的说明,让您的怀疑正确,艾伦。 EventItemCategory.hpp:66:7: 注意:'EventItemCategory::EventItemCategory(const EventItemCategory&)' 被隐式声明为已删除,因为 'EventItemCategory' 声明了移动构造函数或移动赋值运算符类 EventItemCategory ^~~~~~~~~~~ ~~~~~~
  • 所以在这种情况下,我怎样才能执行相当于 boost::optional get_m_source() { return m_source;我想要一个函数,例如 get_m_source() 以便我可以访问 m_source 以进行调试。

标签: c++ boost


【解决方案1】:

好的,所以解决方案是移动它,因为它不可复制! 通过此更改,为我编译了 MSVP。

boost::optional get_m_source() { return std::move(m_source); }

【讨论】:

  • 那有清除m_source的副作用。对于名为 getXXXXXX 的成员函数来说,这很奇怪
  • 猜猜看。我想我可能已经感受到了副作用。发生崩溃,在我进行调试并删除对 get_m_source() 的调用后它消失了
  • 我不得不使用 m_source 检查一些内容。但 EventItemCategory 声明了一个移动构造函数,因此不可复制。如果我必须得到 m_source,我只能再次移动它并返回它!我还能做些什么来防止崩溃吗?如果像 EventItemCategory 这样的类使其不可复制怎么办。
  • 如果某些东西是不可复制的,并且你不想复制它,也许不要复制它。最自然的方式是返回一个引用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多