Я хочу написать интерфейс для mongocxx, используя идиому PIMPL. Сам интерфейс работает, но я сделал что-то не так со встроенными пространствами имен 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;
Тест, который я моделирую с помощью main. cpp:
#include <mongocxx/instance.hpp>
//#include <libsystem/MongoInterface.h>
int main(int /*argc*/, char* /*argv*/[])
{
mongocxx::instance instance{};
}
Компилируется точно такой же код. Но когда я включаю строку 2 main. cpp, она не может сказать
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 и нашел свою реализацию методом проб и ошибок. Есть ли у кого-нибудь подсказка, как лучше реализовать классы интерфейса?