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;

システムと OVR の両方で定義されているため、String を使用しようとしたときに元のエラーが発生しました。コードを System::String に変更しましたが、OVR::System で既に定義されているため、システムがあいまいであるというエラーが表示されました。

この競合を回避する方法はありますか? OVR::String と OVR::System が「using」句の影響を受けないようにする方法はありますか? 私のコードでは、これらの名前空間のメンバーへの参照がたくさんあるため、'using' 句の 1 つを取り除くことができません。

4

2 に答える 2

1

まず、名前を具体的に使用するためにいつでも名前を完全修飾できます。

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

また、特定のusingディレクティブを使用して、名前を完全修飾せずにあいまいさを解消することもできます。

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

Usingディレクティブは任意のレベルに配置でき、このレベルにのみ影響します。たとえば、1 つをグローバル レベルに置くと、すべてのファイルがその影響を受けます。関数内に配置すると、関数だけが影響を受けます。

また、ご存じかどうかわかりませんが、C++ のようなコードで .NET クラスを使用できるようにする C++ の拡張機能である C++CLI を使用しています。これは、Microsoft プラットフォームでのみ機能します。

于 2014-05-09T18:49:54.087 に答える
0

OVR 名前空間には、一般的な名前を持ち、使用しているものと競合する可能性のあるものが大量に含まれているため、インポートしないでください。つまり、次のことはしないでください。

using namespace OVR;

代わりに、次のように必要な特定の OVR アイテムをインポートします。

using OVR::Matrix4f;

Matrix4fインポートしなかった他のタイプの競合について心配することなく、コードで装飾されていないクラス を使用できるようになりました。

競合が発生する問題がまだある場合 (たとえば、OVR Matrix4f クラスと独自の Matrix4f クラスを使用する必要がある場合)、2 つのオプションがあります。それらの1つに明示的な名前空間を使用する必要があることを受け入れるか、それらの1つにtypedefを作成します。

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