You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:31:20