2013-08-16 32 views
4

我收到錯誤C2248,當我嘗試編譯這個結構類性病聲明私有成員::未來:錯誤C2248:「的std ::未來<Worldlet> ::未來」:不能訪問<Worldlet>

struct LoadingWorldlet { 
    int x, z; 
    std::future<Worldlet> result; 
}; 

我試圖讓結果成爲參考,但後來我得到錯誤C2512。當我修復這個錯誤時,我會獲得C2582的xutility。什麼是解決這個第一個錯誤而不是第二個錯誤的方法,或者解決第二個錯誤的方法是什麼?

+3

這可能意味着你正試圖複製你的結構的一個實例。 '未來'不可複製,只是可移動複製。你能發佈一個重現錯誤的最小代碼示例嗎? – juanchopanza

回答

4

std::future<Worldlet>替換爲std::shared_future<Worldlet>可能會解決您的即時編譯問題。

但問題的根源在於您可能只需要std::future的一位消費者。您正在複製某個地方的struct,這是要求將兩個future s綁定到相同的源promise(或任何來源)。

std::future旨在向一位消費者提供一次數據。所以如果你想移動它,你必須move它,而不是複製它。

作爲錯誤的猜測,您正在編譯MSVC2012。該編譯器缺少自動移動構造函數和賦值構造函數的創建。所以嘗試添加一個顯式的移動構造函數和move-assign方法。

struct LoadingWorldlet { 
    int x, z; 
    std::future<Worldlet> result; 
    LoadingWorldlet(LoadingWorldlet&& o):x(o.x),y(o.y),result(std::move(o.result)) {} 
    LoadingWorldlet& operator=(LoadingWorldlet&& o) { 
    x = o.x; 
    y = o.y; 
    result = std::move(o.result); 
    return *this; 
    } 
}; 

然後,避免隱式複製你的LoadingWorldlet

相關問題