gpt4 book ai didi

c++ - 如何将 mongocxx 与内联命名空间和 PIMPL 成语一起使用?

转载 作者:行者123 更新时间:2023-12-02 10:31:27 25 4
gpt4 key购买 nike

我想使用 PIMPL 成语编写一个到 mongocxx 的接口(interface)。接口(interface)本身可以工作,但我对 mongocxx 内联命名空间做错了,因为编写测试不起作用。

这是一个最小的例子:

MongoInterface.h:

#pragma once
#include <memory>

namespace mongocxx
{
namespace v_noabi
{
class instance;
}
}

class MongoInterface
{
public:
MongoInterface();
virtual ~MongoInterface();

protected:
std::unique_ptr<mongocxx::v_noabi::instance> mp_instance;
};

MongoInterface.cpp:
#include <mongocxx/instance.hpp>
#include <libsystem/MongoInterface.h>

MongoInterface::MongoInterface()
: mp_instance(nullptr)
{
mp_instance = std::make_unique<mongocxx::instance>();
}

MongoInterface::~MongoInterface() = default;

我用 模拟的测试主.cpp :
#include <mongocxx/instance.hpp>
//#include <libsystem/MongoInterface.h>

int main(int /*argc*/, char* /*argv*/[])
{
mongocxx::instance instance{};
}

与上面完全相同的代码编译。但是当我包含 main.cpp 的第 2 行时,它没有说
In file included from /home/user/Development/3rdparty/mongo-cxx-driver/3.5.0/build/install/include/mongocxx/v_noabi/mongocxx/config/prelude.hpp:58,
from /home/user/Development/3rdparty/mongo-cxx-driver/3.5.0/build/install/include/mongocxx/v_noabi/mongocxx/instance.hpp:19,
from /home/user/Development/sim-cad/source/examples/mongodb/playground/main_mongoPlayground.cpp:2:
/home/user/Development/3rdparty/mongo-cxx-driver/3.5.0/build/install/include/mongocxx/v_noabi/mongocxx/config/config.hpp:15:58: error: inline namespace must be specified at initial definition
15 | #define MONGOCXX_INLINE_NAMESPACE_BEGIN inline namespace v_noabi {
| ^~~~~~~
/home/user/Development/3rdparty/mongo-cxx-driver/3.5.0/build/install/include/mongocxx/v_noabi/mongocxx/instance.hpp:22:1: note: in expansion of macro ‘MONGOCXX_INLINE_NAMESPACE_BEGIN’
22 | MONGOCXX_INLINE_NAMESPACE_BEGIN
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我想我在 MongoInterface 的实现上做错了。我不太了解 mongocxx 的内联命名空间,并通过反复试验找到了我的实现。有人提示如何更好地实现接口(interface)类吗?

最佳答案

您不应该将 v_noabi 命名为命名空间。该命名空间是 inline , 因为它的存在是为了允许 mongocxx 的 future 版本拥有不同的 ABI。这意味着不可能可靠地转发声明像 mongocxx::instance 这样的东西。 .这实际上是一个非常有趣的观察结果(对我来说,作为最初的 mongocxx 设计师),我认为这是一个缺陷。请看 https://blog.libtorrent.org/2017/12/forward-declarations-and-abi/了解更多详情。我建议你在 mongocxx JIRA 项目中打开一张票,并引用这个讨论。答案可能是产生 bsoncxx_fwd.hppmongoocxx_fwd.hpp包含相应库中所有类型的正确前向声明的文件。

关于c++ - 如何将 mongocxx 与内联命名空间和 PIMPL 成语一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62083738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com