我想使用PIMPL习惯用法为mongocxx编写接口(interface)。接口(interface)本身可以工作,但是我对mongocxx内联 namespace 做错了,因为编写测试无法正常工作。
这是一个最小的示例:
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;
我使用 main.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的内联 namespace ,并通过反复试验发现了我的实现。有人提示如何更好地实现接口(interface)类吗?
最佳答案
您根本不应命名v_noabi
命名空间。该 namespace 是inline
,因为它存在以允许将来的mongocxx
版本具有不同的ABI。这意味着不可能可靠地转发诸如mongocxx::instance
之类的声明。这实际上是一个非常有趣的观察(对我而言,作为原始的mongocxx
设计者),我认为这是一个缺陷。有关更多其他信息,请参见https://blog.libtorrent.org/2017/12/forward-declarations-and-abi/。我建议您在mongocxx JIRA项目中打开一张票,并参考此讨论。答案可能是产生bsoncxx_fwd.hpp
和mongoocxx_fwd.hpp
文件,这些文件包含相应库中所有类型的正确正向声明。