You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Boost JSON自定义对象数组的结构体转JSON编译错误排查

Boost JSON自定义对象数组的结构体转JSON编译错误排查

嗨,我帮你分析一下这个问题——你遇到的编译错误本质是Boost JSON没办法自动把std::vector<CRDApp>隐式转成boost::json::value,虽然你已经给CRDApp写了value_fromtag_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.appsvalue_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

火山引擎 最新活动