10

我有以下 protobuf 定义:

message CBMessage {

    required int32 type = 1; //defines the kind of message that we send
    optional RepoMessage repomessage = 2;

    message RepoMessage { 
        optional int32 nodeid = 1;
        optional int32 timestampsec = 2;
        optional int32 timestampmicrosec = 3;
    }
}

如您所见,repomessage归档是“外部”消息的归档CBMessage

我想访问nodeid(“内部”消息的RepoMessage)归档以修改此参数。所以我创建了一个 CBMessage 对象:

CBTxMessages::CBMessage* cbmsg;
this->cbmsg = new CBTxMessages::CBMessage;

我试图以nodeid这种方式修改文件:

this->cbmsg->repomessage().set_nodeid(message[0]);

然而,我在编译时收到以下错误:

错误:pasar 'const CBTxMessages::CBMessage_RepoMessage' como el argumento 'this' de 'void CBTxMessages::CBMessage_RepoMessage::set_nodeid(google::protobuf::int32)' descarta a los calificadores [-fpermissive]

(错误是西班牙语,但我认为您可以理解)。可能的翻译是:

“'void CBTxMessages :: CBMessage_RepoMessage :: set_nodeid (google :: protobuf :: int32)' 的 'this' 参数丢弃了限定符”)

我对其进行了调查,发现问题与repomessage归档返回 ( repomessage()) 的“基本 getter”作为 const 引用返回(因此不能直接修改)这一事实有关,但我确实希望对其进行修改。

我该如何解决这个问题?

谢谢。

4

1 回答 1

12

代替

this->cbmsg->repomessage().set_nodeid(message[0]);

你需要

this->cbmsg->mutable_repomessage()->set_nodeid(message[0]);

直接设置repomessage字段。repomessage()将返回一个const CBMessage_RepoMessage&无法修改的。

于 2012-11-05T10:43:42.043 回答