将元组分配给类成员变量 我有一个C++类,其中有一个元组,包含一些图像数据和图像尺寸。我已将其键入如下: #include <tuple> #include <memory> typedef std::tuple<std::unique_ptr<unsigned char[]>, int, int> ImageType;

将元组分配给类成员变量 我有一个C++类,其中有一个元组,包含一些图像数据和图像尺寸。我已将其键入如下: #include <tuple> #include <memory> typedef std::tuple<std::unique_ptr<unsigned char[]>, int, int> ImageType;,c++,stdtuple,C++,Stdtuple,但是,当我将一个元组分配给我的成员变量tuple时,我得到以下错误: 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_dele

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

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);
错误:使用已删除的函数'std::unique\u ptr&std::unique\u ptr::operator=(const std::unique\u ptr&)[带\u Tp=unsigned char;_Dp=std::default\u delete]'
_M_头(*此)=M_头(u 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;
}
#包括
#包括
#包括
#包括
typedef std::元组图像类型;
类数据模型
{
公众:
void setImage(图像类型图像)
{
我的图像=图像;
}
图像类型myImage;
};
int main()
{
std::unique_ptr ptr(新的无符号字符[100]);
ImageType im=std::make_tuple(std::move(ptr),10,10);
数据模型dm;
dm.setImage(im);
返回0;
}

您也可以尝试在此处在线编译此文档:

因为您的
元组
包含一个
唯一的\u 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请尝试仅通过值传递的编辑版本,@下划线\u d yes
image
是一个名称,因此它是一个左值@卢卡,因为我们正在讨论的。
setImage
中的移动丢失。@jdehesa您刚才忘记了
std::move
调用
std::unique\u ptr
中的
std::make\u tuple
DataModel dm;
dm.setImage(std::make_tuple(std::move(ptr), 10, 10));