我在一个包装器下定义了不同的消息类型。
例如:
在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&)
。
关于如何解决这个问题,有什么建议吗?
发布于 2015-06-04 01:40:59
您应该执行常规的C++ static_cast
,即:
msg1.CopyFrom(static_cast<MessageType1&>(proto));
注意,这当然需要输入消息实际上是这种类型的,如果不是,它将崩溃。你可以使用dynamic_cast
在运行时验证转换是安全的,但这需要启用RTTI,它可能会很慢。
如果您希望输入消息实际上不是C++类型MessageType1
,而是与有线格式兼容的类型,那么您可以尝试:
msg1.ParseFromString(proto.SerializeAsString());
即序列化,然后重新解析。当然,这将是非常缓慢的。不要忘记检查错误返回。
发布于 2015-06-03 14:26:28
Copyfrom希望收到MessageType1。
看起来您正在尝试发送到CopyFrom MessageLite,而不是MessageType1
(顺便说一句,如果你发送了所有的原型文件,我们可能会看到什么是MessageLite,目前我只能猜测这是你的原型中的另一个信息)
https://stackoverflow.com/questions/30610982
复制相似问题