暧昧的象征。需要保留两个名称空间

时间:2014-05-09 18:45:02

标签: namespaces c++-cli oculus

我从Oculus Rift读取并通过串口编写来控制Arduino,但由于我是C ++的新手,我在命名空间方面遇到了一些问题。

我的代码的开头是这样的:

#using <System.dll>

#include "OVR.h"
#include <iostream>
#include <conio.h>

using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;
using namespace OVR;

当我尝试使用String时出现原始错误,因为它在System和OVR中都定义了。我将代码更改为System :: String但是现在我收到一个错误,告诉我系统是不明确的,因为它已经在OVR :: System中定义了

有没有办法避免这种冲突?一些方法可以排除OVR :: String和OVR :: System受到&#39;使用&#39;条款?我无法摆脱其中一个使用&#39;因为我在代码中有很多对这些命名空间成员的引用。

2 个答案:

答案 0 :(得分:1)

首先,您始终可以完全限定名称以专门使用它:

::System::String^ string; // this will always work

您还可以使用特定的using指令消除歧义,而无需完全限定名称:

using ::System::String;
String^ string;

Using指令可以放在任何级别,只会影响这个级别。例如,如果您将一个放在全局级别,那么您的所有文件都将受其影响。如果你把它放在一个函数中,只有你的函数会受到它的影响。

另外,我不知道你是否意识到这一点,但你正在使用C ++ CLI,它是C ++的扩展,它允许你使用带有C ++代码的.NET类。这仅适用于Microsoft平台。

答案 1 :(得分:0)

OVR命名空间包含大量具有通用名称且可能与您正在使用的内容冲突的内容,因此请勿导入。换句话说,不要这样做:

using namespace OVR;

而是导入您想要的特定OVR项目:

using OVR::Matrix4f;

您现在可以在代码中使用未经修饰的Matrix4f类,而不必担心您没有导入冲突的其他类型。

如果您仍然存在冲突问题(比如说您需要使用OVR Matrix4f类和您自己的Matrix4f类),那么您有两个选择。要么接受您必须为其中一个使用显式名称空间,要么为其中一个创建typedef:

typedef OVR::Matrix4f OVRMat4;
Matrix4f foo;
OVRMat4 foo;