我正在尝试创建一个函数func
,该函数返回std::tuple
和std::unique_ptr<A>
的double
。但是,当我尝试创建元组时,出现错误。代码如下:
#include <tuple>
#include <memory>
class A {
public:
A() : data (3){}
private:
double data;
};
std::tuple<std::unique_ptr<A>, double> func(double num) {
std::unique_ptr<A> a = std::make_unique<A>();
std::tuple<std::unique_ptr<A>, double> temp = std::make_tuple(a, num); // ERROR MESSAGE C
return temp;
}
int main() {
return 0;
}
此代码在Visual Studio中产生以下4个错误。错误讯息A:
tuple(827,18): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to '_Ttype'
错误消息B:tuple(825,83): message : No constructor could take the source type, or constructor overload resolution was ambiguous
错误消息C:Source.cpp(14): message : see reference to function template instantiation 'std::tuple<std::unique_ptr<A,std::default_delete<A>>,double> std::make_tuple<std::unique_ptr<A,std::default_delete<A>>&,double&>(std::unique_ptr<A,std::default_delete<A>> &,double &)' being compiled
错误消息D:tuple(827,12): error C2064: term does not evaluate to a function taking 2 arguments
首先,此错误的原因是什么?其次,与A
关联的a
是否放置在堆中?
最佳答案
std::unique_ptr
不可复制。您正在尝试将std::unique_ptr
复制到元组,但这将不起作用。编译器错误消息是一种含糊的IMO,但这基本上是问题所在。
但是,std::unique_ptr
是可移动的,因此可以使用std::move
:std::tuple<std::unique_ptr<A>, double> temp = std::make_tuple(std::move(a), num);
关于c++ - 使元组包含unique_ptr时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64247216/