2017-08-01 77 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