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;
    }
}

お気づきのように、repomessagefiledは「outer」メッセージのfiledですCBMessage

このパラメータを変更するためにnodeid、(「内部」メッセージの)filedにアクセスしたいと思います。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 argumentso'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提出されたreturns(repomessage())の「基本ゲッター」がconst参照として返されるという事実に関連していることがわかりました(したがって、直接変更することはできません)が、変更したいと思います。

どうすればこれを解決できますか?

ありがとう。

4

1 に答える 1

12

それ以外の

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

あなたは必要になるでしょう

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

repomessageフィールドを直接設定します。変更できないrepomessage()a を返します。const CBMessage_RepoMessage&

于 2012-11-05T10:43:42.043 に答える