2017-08-01 69 views
2

我有一个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

回答

3

由于您tuple包含unique_ptr它是不可复制的,所以你可以做以下

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

然后调用它

​​3210

或只是直接

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

为什么使用右值引用而不是非参考? – user2079303

+0

这将是也没关系,那么你只需要'的std :: move'二传手内分配给成员变量。 – CoryKramer

+0

@CoryKramer感谢您的答复。我试过这个,但得到了同样的错误:cpp.sh/3ssql – Luca