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

使用std::make_shared创建对象时报C2664参数转换错误如何解决?

C2664错误排查与解决方案

问题根源

你遇到的编译错误核心有两个可能的触发原因:

  • 要么是你调用std::make_shared时错误指定了模板参数为myApp::WorldData*而非myApp::WorldData,要么是mWorldData被声明为std::shared_ptr<myApp::WorldData*>(指向指针的智能指针)而非std::shared_ptr<myApp::WorldData>,两种情况都会导致std::make_shared的参数匹配逻辑异常,出现提示第一个参数为myApp::WorldData*类型不匹配的报错。
  • 构造函数参数的引用限定问题:你定义的构造函数第一个参数是非常量左值引用std::string&,部分场景下std::make_shared的完美转发机制会出现匹配偏差,即使你传入的是左值std::string变量也可能触发匹配失败。

修复步骤

  1. 首先检查两处声明是否正确:
// make_shared模板参数应直接写类名,不要加指针符号
mWorldData = std::make_shared<myApp::WorldData>(environmentFile, true);
// mWorldData的类型应为指向类的智能指针,不是指向类指针的智能指针
std::shared_ptr<myApp::WorldData> mWorldData;
  1. 建议修改构造函数的第一个参数为常量左值引用,符合构造函数不需要修改入参的常规场景,同时规避引用匹配问题:
// 修改后的构造函数签名
WorldData(const std::string& environmentFile, bool isProduction = false);
  1. 如果你确实需要在构造函数内修改传入的environmentFile变量,可以用std::ref包装入参,显式告知编译器你要传递左值引用:
mWorldData = std::make_shared<myApp::WorldData>(std::ref(environmentFile), true);

内容的提问来源于stack exchange,提问作者nathan lachenmyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:48:03