Boost JSON自定义对象数组的结构体转JSON编译错误排查
Boost JSON自定义对象数组的结构体转JSON编译错误排查
嗨,我帮你分析一下这个问题——你遇到的编译错误本质是Boost JSON没办法自动把std::vector<CRDApp>隐式转成boost::json::value,虽然你已经给CRDApp写了value_from的tag_invoke重载,但在构造JSON对象的时候,得显式触发这个转换逻辑才行,不能直接把容器丢进初始化列表里。
先看错误提示:no matching function for call to 'boost::json::value::value(const std::vector<CRDApp>&, ...)',这说明编译器找不到直接把vector<CRDApp>转成JSON值的构造函数。Boost JSON对内置类型或者简单容器(比如vector<int>)是支持隐式转换的,但对于装了自定义类型的容器,必须手动调用boost::json::value_from()来启动你写的自定义转换逻辑。
解决方法很简单,修改CRDSpec里的value_from重载,把spec.apps用value_from包裹起来就行:
friend void tag_invoke( boost::json::value_from_tag, boost::json::value& jv, CRDSpec const& spec ) { jv = { { "namespace" , spec._namespace }, { "apps", boost::json::value_from(spec.apps) } // 显式调用value_from触发转换 }; }
这样改完之后,Boost JSON会逐个调用你为CRDApp实现的value_from函数,把每个CRDApp对象转成JSON值,再拼成JSON数组,完全符合你想要的效果。
顺便说一句,你给CRDApp写的tag_invoke重载是没问题的,用friend函数的形式能让ADL(参数依赖查找)正确找到这个重载,配合显式的value_from调用就能正常工作啦。
备注:内容来源于stack exchange,提问作者hirish




