3

我有以下 protobuf 消息:

message gen_Journey {
  repeated gen_ProposedSegment proposedSegments = 1;
}

生成的cpp如下

// repeated .gen_ProposedSegment proposedSegments = 1;
int gen_Journey::proposedsegments_size() const {
  return proposedsegments_.size();
}
void gen_Journey::clear_proposedsegments() {
  proposedsegments_.Clear();
}
const ::gen_ProposedSegment& gen_Journey::proposedsegments(int index) const {
  // @@protoc_insertion_point(field_get:gen_Journey.proposedSegments)
  return proposedsegments_.Get(index);
}
::gen_ProposedSegment* gen_Journey::mutable_proposedsegments(int index) {
  // @@protoc_insertion_point(field_mutable:gen_Journey.proposedSegments)
  return proposedsegments_.Mutable(index);
}
::gen_ProposedSegment* gen_Journey::add_proposedsegments() {
  // @@protoc_insertion_point(field_add:gen_Journey.proposedSegments)
  return proposedsegments_.Add();
}
::google::protobuf::RepeatedPtrField< ::gen_ProposedSegment >*
gen_Journey::mutable_proposedsegments() {
  // @@protoc_insertion_point(field_mutable_list:gen_Journey.proposedSegments)
  return &proposedsegments_;
}
const ::google::protobuf::RepeatedPtrField< ::gen_ProposedSegment >&
gen_Journey::proposedsegments() const {
  // @@protoc_insertion_point(field_list:gen_Journey.proposedSegments)
  return proposedsegments_;
}

我创建了以下向量:

std::vector<gen_ProposedSegment *> proposedSegment

基于使用 memcpy 将 std::vector 从 protobuf 复制到重复字段, 我执行了以下操作:

Journey::Journey(std::vector<gen_ProposedSegment *> proposedSegment) {
    this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}

问题是我收到以下错误:

/home/compilation/UnixPackagesFareShopping/src/DOM/src/journey.cpp:10:35: error: lvalue required as left operand of assignment

我究竟做错了什么?

4

2 回答 2

3

mutable_proposedsegments()方法返回一个指针,因此您可能*在一开始就丢失了 - 尝试:

Journey::Journey(std::vector<gen_ProposedSegment *> proposedSegment) {
    *this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}

此外,要使其正常工作,您需要将输入类型std::vector<gen_ProposedSegment>改为(并更好地使用 const ref),即:

Journey::Journey(const std::vector<gen_ProposedSegment>& proposedSegment) {
    *this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}

或者,您需要在 for 循环中插入项目(请参阅 参考资料std::for_each)。

于 2018-10-10T12:35:18.413 回答
2

您必须迭代给定的向量并将对象手动添加到您的 protobuf 消息中。您不能为此使用 memcpy 操作。

以下代码未经测试就写在我的脑海中......但应该为您指明正确的方向。顺便说一句:我假设在这种情况下Journey继承自。gen_Journey否则你必须相应地调整“this->”语句。

Journey::Journey(const std::vector<gen_ProposedSegment *> &proposedSegment) {
    auto copy = [&](const gen_ProposedSegment *) {
        auto temp_seg = this->add_proposedsegments();
        temp_seg->CopyFrom(*gen_ProposedSegment);
    };
    std::for_each(proposedSegment.cbegin(), proposedSegment.cend(), copy);
}
于 2018-10-10T12:52:01.027 回答