Как использовать mongocxx со встроенными пространствами имен и идиомой PIMPL? - PullRequest
1 голос
/ 29 мая 2020

Я хочу написать интерфейс для 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 и нашел свою реализацию методом проб и ошибок. Есть ли у кого-нибудь подсказка, как лучше реализовать классы интерфейса?

1 Ответ

0 голосов
/ 01 августа 2020

Вы вообще не должны называть пространство имен v_noabi. Это пространство имен inline, поскольку оно существует, чтобы позволить будущей версии mongocxx иметь другой ABI. Это означает, что невозможно надежно пересылать объявления типа mongocxx::instance. На самом деле это очень интересное наблюдение (для меня, как для оригинального дизайнера mongocxx), и я считаю это дефектом. Пожалуйста, см. https://blog.libtorrent.org/2017/12/forward-declarations-and-abi/ для получения дополнительной информации. Я предлагаю вам открыть заявку в проекте mongocxx JIRA и сослаться на это обсуждение. Ответ, вероятно, заключается в создании файлов bsoncxx_fwd.hpp и mongoocxx_fwd.hpp, которые содержат правильные форвардные объявления для всех типов в соответствующих библиотеках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...