在ue c++中使用protobuf时,一旦.proto文件中包含map字段,就会导致编译报错
error C4800 从“xxxxxx”到 bool 的隐式转换。信息可能丢失
ue把这个警告视为了错误,纯c++工程是没有错误可以通过的
最终解决方案
修改\Protobuf\include\google\protobuf\map_field_inl.h这个文件
添加#pragma warning(disable: 4800)
尝试过的其他方式
1使用其他版本的protobuf
使用其他版本打一次包太麻烦了,而且没有搜索到相关信息,不能保证解决,放弃
2修改源代码中的隐式转换
查看报错有两处隐式转换
第一处是一个返回值,简单, 加个显示转换就好了,

第二处是这里,有点痛苦了,一个模板参数去匹配MapValueSpaceUsedExcludingSelfLong,后者又有三个版本,一个string, 一个bool,一个模板,直接删除bool版本会报错,模板会一点但不多,找ai写了个分支选择的
但是又出现了第三处报错,第三处来自于.proto生成pb.cc文件,
同样的pb.cc在纯c++工程是能通过的,但是ue中把再次把bool的隐式转换视为了错误
如果要解决,思路写个脚本处理pb.cc文件,给所有隐式转换的地方改成显示转换,但是这样维护起来太痛苦了
思路转变为屏蔽掉c4800这个报错
,

3.Build.cs中操作
在该文件下添加了选项PublicDefinitions.Add(“DISABLE_WARNING_4800”);
无效,Ai给出的解释是:这个宏只是一个普通的预处理定义,没有实际的编译器指令功能
最终变成了开头直接在对应头文件里屏蔽这个错误

4906

被折叠的 条评论
为什么被折叠?



