C++ 如何将mongocxx与内联名称空间和PIMPL习惯用法一起使用?
我想用PIMPL语言编写一个到mongocxx的接口。接口本身可以工作,但我对mongocxx内联名称空间做了一些错误,因为编写测试不起作用 这是一个简单的例子: MongoInterface.h: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:
#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
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~