使用make_shared创建shared_ptr时触发构造函数匹配错误,求助排查
编译错误分析:no matching function for call to 'Company::Company(Company*)'
错误原因
你误用了std::make_shared的用法:
make_shared的设计目的是直接接收类构造函数的参数,在内部完成对象的创建和内存管理,不需要提前用new创建对象指针传入。- 你的代码
make_shared<Company>(new Company(123456,100))相当于把一个Company*类型的指针传给Company的构造函数,但你的Company类只定义了接收两个int参数的构造函数,以及默认生成的拷贝/移动构造函数,没有能接收Company*的构造函数,因此编译器找不到匹配的构造函数,触发报错。
解决方法
有两种正确的写法,推荐第一种:
写法1(推荐):直接传入构造函数参数给make_shared
#include <iostream> #include <string> #include <memory> using namespace std; class Company{ public: int companyId; int value; int HighestSalaryEmployee; int highestSalary; int LowestIDHighestSalaryEmployee; int lowestSalary; int numEmployees; public: Company(int companyId,int value):companyId(companyId),value(value){ HighestSalaryEmployee=11; highestSalary=0; LowestIDHighestSalaryEmployee=112; numEmployees=0; } }; int main() { shared_ptr<Company> ptr1 = make_shared<Company>(123456, 100); }
这种方式让make_shared在内部一次性分配对象内存和shared_ptr的控制块内存,效率更高,也能避免new之后shared_ptr构造前发生异常导致的内存泄漏。
写法2:手动new后传给shared_ptr构造函数(不推荐)
如果一定要手动创建对象,可以直接将new出来的指针传给shared_ptr的构造函数,但这种方式不如make_shared高效:
int main() { shared_ptr<Company> ptr1(new Company(123456, 100)); }
内容的提问来源于stack exchange,提问作者Algo
相关产品推荐
相关产品推荐

