2017-09-21 7 views
0

ネイティブCコード用のC++/CLIラッパーを作成していますが、これは自分のObjectというtypedefを持ち、リンク時にC2872 'Object': ambiguous symbolエラーが発生しています。コンパイラの出力は次のようになります。Visual Studioで 'Object'を処理する方法:あいまいなシンボル

1>C:\src\OS_kernel.h(27): error C2872: 'Object': ambiguous symbol 
1>C:\src\OS_types.h(261): note: could be 'ObjectStruct *Object' 
1>C:\src\OS_kernel.h(27): note: or  'System::Object' 

それは私がC++/CLIのラッパーの目的のために、このネイティブCコードをからかっていますことを言及する価値があるかもしれません。利用可能なソースコードがない場合には利用できない可能性のある解決策を開くかどうかはわかりません。どの定義を使用するかを指定する方法はあると思いますが、その指定方法はわかりません。それは可能ですか? ObjectStruct *Objectを使用するよう指定します。

モックコードを変更する必要がない場合は、数百または数千の個別の場所になる可能性があるのですばらしいことです。

また、BufferBooleanのように、ネイティブライブラリで使用されている他のタイプの場合にもこのエラーが発生します。

+1

グローバルスコープCの 'Object'を参照するには、スコープ解決演算子' :: 'で' :: Object'を使用できるはずです。 – crashmstr

+0

それはうまくいった!悲しいことに、この解決策は私がこのあいまいなエラーがモックコードで発生するすべての場所に触れる必要があることを意味します。 –

答えて

3

OK、OS_kernel.hでエラーが発生しているので、私はあなたがラップしているCコードの一部だと推測しています。

明らかに、可能な解決策の1つは予約語としてObjectという名前を扱い、それを使用しないようにCコードを編集することです。これが最も正しい解決策であると主張できますが、そうすることは不可能かもしれません。

Cコードをどのように参照しているかによって、C++としてコンパイルし、名前空間内に完全に収めることは妥当かもしれません。このようにして、Cコード(現在はC++コード)がObjectを使用すると、その名前空間内のtypedefが表示され、コード内のいずれかの名前空間を参照するオプションがあります。

あなたのライブラリのヘッダファイルからこのエラーを取得しているという事実は、あなたがusing namespace System;ディレクティブを持っていることを私に示し、あなたのライブラリのヘッダファイルの#includeは、ディレクティブを使用していること後が来ることを。 using namespace System;を削除するか、少なくとも#includeの後に移動することを検討してください。この方法では、ライブラリのヘッダーにそのエラーが表示されることはありません。コードで対処する必要があります。

+0

Ahh、using namespace System;を削除することをお勧めします。ありがとう! –

関連する問題