VS2019使用boost库时make_shared报C2063错误如何解决
问题修复方案
核心原因
你遇到的编译报错是VS2019 对 C++ 模板函数的友元声明匹配规则比 VS2010 严格得多导致的,和 Boost 版本无关:
boost::make_shared本质是模板函数,不是普通非模板函数- VS2010 校验宽松,会隐式把你写的普通函数友元声明匹配到对应模板实例
- VS2019 严格遵循 C++ 标准,普通函数声明无法匹配模板函数,直接触发 C2063 报错
修复步骤
方案1:针对指定参数版本的 make_shared 声明友元
如果只需要开放给接受 std::string 常量引用参数的 make_shared 实例,按如下写法修改:
- 提前包含 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);
- 类内的友元声明改为指定模板实例的格式:
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
相关产品推荐
相关产品推荐

