Google 为他们从 Ad Exchange 网络发送的消息提供了一个 protobuf 模板。 (免费提供 here)我使用 protoc
将此模板转换为 C++ 代码(自动生成)。我遇到一个问题,其中一个类的名称与我定义的名称冲突,例如
#include "realtime-bidding.pb.h"
// g++ complains that BidRequest is ambiguous.
void BidRequest::FromGoogle(const std::string& protobuf)
{
// This what I want to write:
// Google::BidRequest r;
// r.ParseFromString(protobuf);
if (r.has_field())
{
this->field = r.field();
}
}
如果不编辑由 protoc
自动生成的文件,我将无法执行此操作(不好,因为每次 .proto
文件是,我们都必须这样做改变了),我想不出一种通过使用命名空间
来做到这一点的方法。
真正的问题是 Google 坚持某些类在全局命名空间中,例如
// from realtime-bidding.pb.h
class Bidrequest_Mobile : public ::google::protobuf::Message {
inline ::BidRequest_Mobile_DeviceOsVersion* mutable_os_version();`.
^^
}
所以我不能做类似的事情
namespace Google {
#include "realtime-bidding.pb.h"
}
因为它会停止编译自动生成的代码。
给我的代码命名空间意味着对非常非常大的代码库进行太多更改,尽管这可能是正确的解决方案。然而,我就在我所在的地方。
有什么技巧可以让这一切在不编辑自动生成的文件的情况下工作吗? 是否有一些类被放入全局命名空间的原因?
最佳答案
您可以在 .proto 文件中使用 package
。
https://developers.google.com/protocol-buffers/docs/proto#packages
关于c++ - 在不编辑标题的情况下取消命名空间类的全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263123/