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

VS2019使用boost库时make_shared报C2063错误如何解决

问题修复方案

核心原因

你遇到的编译报错是VS2019 对 C++ 模板函数的友元声明匹配规则比 VS2010 严格得多导致的,和 Boost 版本无关:

  • boost::make_shared 本质是模板函数,不是普通非模板函数
  • VS2010 校验宽松,会隐式把你写的普通函数友元声明匹配到对应模板实例
  • VS2019 严格遵循 C++ 标准,普通函数声明无法匹配模板函数,直接触发 C2063 报错

修复步骤

方案1:针对指定参数版本的 make_shared 声明友元

如果只需要开放给接受 std::string 常量引用参数的 make_shared 实例,按如下写法修改:

  1. 提前包含 Boost 头并前置声明模板:
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

// 前置声明你的自定义类
class YourClass;
// 前置声明 make_shared 模板
template <class T, class A1>
boost::shared_ptr<T> boost::make_shared(const A1& a1);
  1. 类内的友元声明改为指定模板实例的格式:
class YourClass {
private:
    // 你的私有构造函数
    YourClass(std::string const& a1);
    // 正确的友元声明,显式指定模板参数
    friend boost::shared_ptr<YourClass> boost::make_shared<YourClass, std::string const&>(std::string const&);
};

方案2:通用写法(推荐)

如果需要兼容任意参数版本的 make_shared,直接声明整个 make_shared 模板为友元即可,适配所有参数场景:

class YourClass {
private:
    YourClass(std::string const& a1);
    // 通用友元声明,支持所有参数组合的 make_shared 实例
    template<class T, class... Args>
    friend boost::shared_ptr<T> boost::make_shared(Args&&... args);
};

该写法兼容 C++11 及以上标准,VS2019 完全支持,无需每次新增参数就修改友元声明。

内容的提问来源于stack exchange,提问作者Siva K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:05