首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何结合行内命名空间和PIMPL成语使用mongocxx?

如何结合行内命名空间和PIMPL成语使用mongocxx?
EN

Stack Overflow用户
提问于 2020-05-29 10:19:58
回答 1查看 140关注 0票数 2

我想使用PIMPL成语为mongocxx编写一个接口。接口本身可以工作,但我在mongocxx内联名称空间中做了一些错误,因为编写测试不起作用。

这是一个最小的例子:

MongoInterface.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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模拟的测试

代码语言:javascript
复制
#include <mongocxx/instance.hpp>
//#include <libsystem/MongoInterface.h>

int main(int /*argc*/, char* /*argv*/[])
{
    mongocxx::instance instance{};
}

代码与上面的代码完全一样编译。但是当我包含main.cpp的第2行时,它失败了

代码语言:javascript
复制
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的内联命名空间,并且通过尝试和错误发现了我的实现。有人有提示如何更好地实现接口类吗?

EN

回答 1

Stack Overflow用户

发布于 2020-08-01 13:16:14

您根本不应该命名v_noabi命名空间。该名称空间是inline,因为它的存在是为了允许未来版本的mongocxx具有不同的ABI。这意味着不可能可靠地转发像mongocxx::instance这样的声明。这实际上是一个非常有趣的观察(对我来说,作为最初的mongocxx设计人员),我认为这是一个缺陷。有关更多细节,请参见https://blog.libtorrent.org/2017/12/forward-declarations-and-abi/。我建议您在mongocxx JIRA项目中打开一张票,并参考此讨论。答案可能是生成bsoncxx_fwd.hppmongoocxx_fwd.hpp文件,这些文件包含相应库中所有类型的正确的前向声明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62083738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档