【问题标题】:assigning a tuple to a class member variable将元组分配给类成员变量
【发布时间】:2017-08-01 14:58:39
【问题描述】:

我有一个 C++ 类,其中有一个元组,其中包含一些图像数据和图像尺寸。我已将其 typedef 如下:

#include <tuple>
#include <memory>

typedef std::tuple<std::unique_ptr<unsigned char[]>, int, int> ImageType;

现在在我的课堂上我有一个方法,我也有一个ImageType 的成员:

void setImage(ImageType image)

但是,当我将一个元组分配给我的成员变量元组时,我收到以下错误:

error: use of deleted function 'std::unique_ptr<_Tp [], _Dp>& std::unique_ptr<_Tp [], _Dp>::operator=(const std::unique_ptr<_Tp [], _Dp>&) [with _Tp = unsigned char; _Dp = std::default_delete<unsigned char []>]'
  _M_head(*this) = _M_head(__in);

演示程序如下:

#include <iostream>
#include <string>
#include <memory>
#include <tuple>

typedef std::tuple<std::unique_ptr<unsigned char[]>, int, int> ImageType;

class DataModel
{

public:
    void setImage(ImageType image)
    {
        myImage = image;
    }

    ImageType myImage;
};

int main()
{
  std::unique_ptr<unsigned char[]> ptr(new unsigned char[100]);    
  ImageType im = std::make_tuple(std::move(ptr), 10, 10);
  DataModel dm;
  dm.setImage(im);

  return 0;
}

你也可以在这里尝试在线编译:cpp.sh/5chnn

【问题讨论】:

    标签: c++ stdtuple


    【解决方案1】:

    由于您的 tuple 包含 unique_ptr 它是不可复制的,因此您可以执行以下操作

    void setImage(ImageType image)
    {
        myImage = std::move(image);
    }
    

    然后调用它

    DataModel dm;
    dm.setImage(std::move(im));
    

    或者直接

    DataModel dm;
    dm.setImage(std::make_tuple(std::move(ptr), 10, 10));
    

    【讨论】:

    • 为什么使用右值引用而不是非引用?
    • 那也可以,那么您只需在 setter 中 std::move 即可分配给成员变量。
    • @Luca 试试简单按值传递的编辑版本,that will work fine
    • @underscore_d 是的。 image 是一个名字,所以它是一个左值。 @Luca 因为我们正在讨论的内容。 setImage 中的移动丢失了。
    • @jdehesa It does 你忘了std::move std::unique_ptrstd::make_tuple 通话中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2017-10-28
    • 2023-03-04
    • 1970-01-01
    • 2023-04-08
    • 2017-09-10
    相关资源
    最近更新 更多