我在包装器下定义了不同的消息类型。
例如:
在test.proto
中Message Wrapper {
required Type type =1;
optional MessageType1 msg1 =2;
optional MessageType2 msg2 =3;
}
和SendData.cpp
sendData(int type, google::protobuf::MessageLite& proto) {
MessageWrapper wrapper;
wrapper.set_type(type);
switch (type) {
case type1:
MessageType1* msg1 = wrapper.mutable_msg1();
msg1.CopyFrom(proto);
break;
}
case type2:
//
}
在这种情况下,CopyFrom
会向我发出错误,没有匹配功能 - 候选人是MessageType1::CopyFrom(const MessageType1&)
。
关于如何解决此问题的任何指示?
答案 0 :(得分:0)
Copyfrom预计会收到 MessageType1 您似乎尝试发送到CopyFrom MessageLite 而不是 MessageType1
(顺便说一句,如果您发送所有原型文件,我们可能会看到什么是MessageLite,目前我只能猜测它在原型中的另一条消息)
答案 1 :(得分:0)
你应该做一个普通的C ++ static_cast
,即:
msg1.CopyFrom(static_cast<MessageType1&>(proto));
请注意,这当然要求输入消息实际上是这种类型,如果它不是,它将崩溃。您可以使用dynamic_cast
代替在运行时验证强制转换是否安全,但这需要启用RTTI,而且速度可能很慢。
如果您希望输入消息实际上不是C ++类型MessageType1
,但是是线格式兼容类型,那么您可以尝试:
msg1.ParseFromString(proto.SerializeAsString());
即。序列化然后重新解析。当然,这将是非常缓慢的。不要忘记检查错误返回。