0

我正在从 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 但现在我收到一个错误,告诉我 System 不明确,因为它已在 OVR::System 中定义

有什么方法可以避免这种冲突吗?排除 OVR::String 和 OVR::System 不受“使用”子句影响的某种方式?我无法摆脱其中一个“使用”子句,因为我的代码中有很多对这些名称空间成员的引用。

4

2 回答 2

1

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

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

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

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

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

另外,我不知道您是否意识到这一点,但您使用的是 C++CLI,它是 C++ 的扩展,可让您将 .NET 类与类似 C++ 的代码一起使用。这仅适用于 Microsoft 平台。

于 2014-05-09T18:49:54.087 回答
0

OVR 命名空间包含大量具有通用名称并且可能与您正在使用的东西冲突的东西,所以不要导入它。换句话说,不要这样做:

using namespace OVR;

相反,导入您想要的特定 OVR 项目,如下所示:

using OVR::Matrix4f;

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

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

typedef OVR::Matrix4f OVRMat4;
Matrix4f foo;
OVRMat4 foo;
于 2014-05-13T20:30:00.767 回答