【问题标题】:The funciton Add of C++ protobuf generates errorsC++ protobuf 的函数 Add 产生错误
【发布时间】:2022-01-07 04:57:44
【问题描述】:

我正在使用带有 protobuf 的 C++14 进行编码。

在我的 proto 文件中,我设计了如下嵌套消息:

message Object {
    // something
};

message Response {
    repeated Object list = 1;
};

在我的 C++ 项目中,我尝试插入一个元素:

Object obj;
Response res;
// res.mutable_list()->Add(obj); // ERROR!
res.mutable_list()->Add()->CopyFrom(obj);

我真的不知道为什么但是Add(obj) 会导致编译错误:

无法将“对象”左值绑定到“对象&&”
res.mutable_info()->添加(obj);

我真的不明白为什么,因为在头文件中,我确实找到了函数inline void RepeatedPtrField<Element>::Add(Element&& value)inline void RepeatedPtrField<Element>::Add(const Element& value) 的定义。但是res.mutable_list()->Add(std::move(obj));res.mutable_list()->Add(obj); 都会导致一些编译错误。另一个错误如下,我完全无法理解它是什么:

没有匹配函数调用 'google::protobuf::RepeatedPtrField::TypeHandler::New(Google::protobuf::Area*&, std::remove_reference::type)'
TypeHandler ::New(arena_, std::move(value));

res.mutable_list()->Add()->CopyFrom(obj); 有效,但为什么我不能直接调用Add(obj)

【问题讨论】:

    标签: c++ protobuf-c


    【解决方案1】:

    Add(Object &&object) 函数要求对象参数是右值引用。您可以使用std::move 强制转换为右值引用。

    Object obj;
    Response res;
    res.mutable_list()->Add(std::move(obj)); // This should work.
    

    但是在使用std::move 之后,您将无法再访问obj 变量,如果您尝试访问它,您将遇到分段错误。这就是为什么使用 protobuf,最好从父对象创建子消息对象。

    【讨论】:

    • 正如我所说,res.mutable_list()->Add(std::move(obj)); 也无法工作。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2011-10-05
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多