如何处理具有相同命名空间的多个导入?

How to handle multiple imports that have the same namespace?

我正在开发一个 C++ 命令行应用程序,它是一个组件对象模型 (COM) 客户端。有两个 COM 服务器实现,我想在我的程序中支持它们(可通过应用程序参数选择)。

两台服务器都在使用相同的命名空间 OmniRig,所以一切都会发生冲突。我试图将它们拆分为单独的 类 以避免冲突,但这没有用。是否可以同时支持这两种 COM 服务器,我将如何去做?

OmniRigV1.h:

#include "OmniRigBase.h"

#import "C:\Program Files (x86)\Afreet\OmniRig\OmniRig.exe"
using namespace OmniRig;

class OmniRigV1 : public OmniRigBase {...}

OmniRigV2.h:

#include "OmniRigBase.h"

#import "C:\Program Files (x86)\Omni-Rig V2\omnirig2.exe"
using namespace OmniRig;

class OmniRigV2 : public OmniRigBase {...}

main.cpp:

int main(int argc, char* argv[])
{
    ProgramOptions options(argc, argv);
    OmniRigBase* omnirig;
    switch (options.getOmnirigVersion()) {
        case OmniRigVersion::OmniRigVersion1:
            omnirig = new OmniRigV1(options);
            break;
        case OmniRigVersion::OmniRigVersion2:
            omnirig = new OmniRigV2(options);
            break;
        default:
            exit(E_OPTION_OMNIRIG_VERSION);
    }
...

完整代码位于: https://github.com/cniesen/IcomClockOmniRig/tree/adf7ce1b0ef716ec2f72d50bffbada4e811a52cf/src

正如评论中提到的 Ingor,我需要将 rename_namespace 选项与 #import 指令一起使用:

#import "C:\Program Files (x86)\Afreet\OmniRig\OmniRig.exe" rename_namespace("OmniRig1")

#import "C:\Program Files (x86)\Omni-Rig V2\omnirig2.exe" rename_namespace("OmniRig2")

现在可以使用适当的名称访问每个实现,例如 OmniRig1::OmniRigXOmniRig2::OmniRigX

归功于 Ingor。