C++ 如何将mongocxx与内联名称空间和PIMPL习惯用法一起使用?

C++ 如何将mongocxx与内联名称空间和PIMPL习惯用法一起使用?,c++,namespaces,inline,mongo-cxx-driver,C++,Namespaces,Inline,Mongo Cxx Driver,我想用PIMPL语言编写一个到mongocxx的接口。接口本身可以工作,但我对mongocxx内联名称空间做了一些错误,因为编写测试不起作用 这是一个简单的例子: MongoInterface.h: #pragma once #include <memory> namespace mongocxx { namespace v_noabi { class instance; } } class MongoInterface { public:

我想用PIMPL语言编写一个到mongocxx的接口。接口本身可以工作,但我对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;
};
#include <mongocxx/instance.hpp>
#include <libsystem/MongoInterface.h>

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

MongoInterface::~MongoInterface() = default;

我想我在MongonterFace的实现上犯了一些错误。我并不真正理解mongocxx的内联名称空间,而是通过反复试验找到了我的实现。有人知道如何更好地实现接口类吗?

您根本不应该命名
v\u noabi
名称空间。该名称空间是内联的,因为它的存在允许未来版本的
mongocxx
具有不同的ABI。这意味着不可能可靠地向前声明类似
mongocxx::instance
的内容。这实际上是一个非常有趣的观察(对我来说,就像原始代码< MangoCXXX <代码>设计器),我认为它是一个缺陷。有关更多详细信息,请参阅。我建议您在mongocxx JIRA项目中打开一个票证,并参考此讨论。答案可能是生成
bsoncxx_fwd.hpp
mongoocxx_fwd.hpp
文件,这些文件包含相应库中所有类型的正确转发声明。

您根本不应该命名
v_noabi
命名空间。该名称空间是内联的,因为它的存在允许未来版本的
mongocxx
具有不同的ABI。这意味着不可能可靠地向前声明类似
mongocxx::instance
的内容。这实际上是一个非常有趣的观察(对我来说,就像原始代码< MangoCXXX <代码>设计器),我认为它是一个缺陷。有关更多详细信息,请参阅。我建议您在mongocxx JIRA项目中打开一个票证,并参考此讨论。答案可能是生成
bsoncxx_-fwd.hpp
mongoocxx_-fwd.hpp
文件,其中包含相应库中所有类型的正确转发声明。

为什么不简单地
#包含
以获得
mongocxx::instance
定义?因为我想隐藏实现(PIMPLE)。与此同时,我发现了问题所在。我必须在MongoInterface.h的第6行添加“inline”,从最后一行的第二行删除“::v_noabi”,然后注意首先包括mongocxx/instance.hpp,然后才包括我自己的接口。当我将MongoInterface.h中的第二行更改为
内联名称空间v_noabi时,一切都很好。为什么不干脆
包括
以获得
mongocxx::instance
定义?因为我想隐藏实现(丘疹)。与此同时,我发现了问题所在。我必须在MongoInterface.h的第6行添加“inline”,从最后一行的第二行删除“::v_noabi”,然后注意首先包括mongocxx/instance.hpp,然后才包括我自己的接口。当我将MongoInterface.h中的第二行更改为
内联名称空间v_noabi
时,一切正常。创建了一个票证:@pooya13-我看到了票证。我现在并不真正参与C++驱动程序,但我会密切关注票,并确保它得到必要的考虑。这些天我并没有真正参与C++驱动程序,但我会密切关注这张票,并确保它得到必要的考虑。
#include <mongocxx/instance.hpp>
//#include <libsystem/MongoInterface.h>

int main(int /*argc*/, char* /*argv*/[])
{
    mongocxx::instance instance{};
}
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
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~