当我尝试编译这个结构时,我收到错误C2248:
struct LoadingWorldlet {
int x, z;
std::future<Worldlet> result;
};
我试图将结果作为引用,但后来我得到错误C2512。当我修复那个错误时,我得到了C2582的xutility。有什么方法可以解决这个第一个错误,而不会得到第二个错误,或者什么方法可以解决后两个错误?
答案 0 :(得分:4)
将std::future<Worldlet>
替换为std::shared_future<Worldlet>
可能会解决您的即时编译问题。
但问题的根源在于,您可能只想要std::future
的一个消费者。您正在复制struct
某处,这要求将两个future
绑定到同一来源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
。