使用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变量也可能触发匹配失败。
修复步骤
- 首先检查两处声明是否正确:
// make_shared模板参数应直接写类名,不要加指针符号 mWorldData = std::make_shared<myApp::WorldData>(environmentFile, true); // mWorldData的类型应为指向类的智能指针,不是指向类指针的智能指针 std::shared_ptr<myApp::WorldData> mWorldData;
- 建议修改构造函数的第一个参数为常量左值引用,符合构造函数不需要修改入参的常规场景,同时规避引用匹配问题:
// 修改后的构造函数签名 WorldData(const std::string& environmentFile, bool isProduction = false);
- 如果你确实需要在构造函数内修改传入的
environmentFile变量,可以用std::ref包装入参,显式告知编译器你要传递左值引用:
mWorldData = std::make_shared<myApp::WorldData>(std::ref(environmentFile), true);
内容的提问来源于stack exchange,提问作者nathan lachenmyer
相关产品推荐
相关产品推荐

