编译时make_unique错误



我刚刚开始学习智能指针 STL::make_unique

必须将旧代码更改为现代 c++

当我编译以下代码行(原始代码示例(时,我收到以下错误

#include <memory>
#include <iostream>
using namespace std;
struct Student
{
int  id;
float Score;
};
auto main()->int
{
auto Student1 = make_unique<Student>(1, 5.5);
//auto Student1 = make_unique<int>(1);  //Works perfectly
//auto Student2 = unique_ptr<Student>{ new Student{1,22.5} }; //Works 
cout << "working";
return 0;
}
1>------ Build started: Project: ConsoleApplication4, Configuration: Debug Win32 ------
1>Source.cpp
1>c:program files (x86)microsoft visual studio2017enterprisevctoolsmsvc14.10.25017includememory(2054): error C2661: 'Student::Student': no overloaded function takes 2 arguments
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(12): note: see reference to function template instantiation 'std::unique_ptr<Student,std::default_delete<_Ty>> std::make_unique<Student,int,double>(int &&,double &&)' being compiled
1>        with
1>        [
1>            _Ty=Student
1>        ]
1>Done building project "ConsoleApplication4.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我试图研究make_unique实现看起来应该有效.查看了上面的网站,可能的实现是

// note: this implementation does not disable this overload for array types
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

所以我的问题是(现在我所拥有的是直接使用unique_ptr(

  1. 如何使用make_unique使其工作

  2. 我可以对 STL 中的make_unique实现进行哪些更改以使其正常工作

经过几个答案 新增问题3

3.最好使用带有构造函数的make_unique或直接使用unique_ptr

unique_ptr<Student>{ new Student{1,22.5} }

我更喜欢后者,因为不需要定义构造函数.请做建议

不幸的是,make_unique不执行直接列表初始化。如果您在此处查看其描述,您将看到以下语句:

构造非数组类型 T。参数参数传递给 T的构造函数。此重载仅参与重载 分辨率(如果 T 不是数组类型(。该函数等效于: unique_ptr(new T(std::forward(args(...((

您的类没有接受两个参数的构造函数。不过,它是一个聚合,可以使用聚合初始化来构造,如第二个示例所示:

auto* p = new Student{2, 3};

但是make_unique没有调用这种形式,所以这就是它失败的原因。有一个建议让它像这样工作:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4462.html

基本上,std::make_unique<T>将其参数转发给类型T的构造函数。但是类Student中没有构造函数接受intdouble。您可以添加一个:

struct Student
{
Student(int id, float Score) : id(id), Score(Score) {}
int  id;
float Score;
};

以使代码正常工作。

相关内容

  • 没有找到相关文章

最新更新