2

クラス「Foo」が定義されているヘッダー ファイル (ネイティブ、サードパーティ) を含む C++/CLI ファイルをコンパイルしようとしました。さらに、名前空間「Foo」が定義されている #using "Bar.dll" 経由で C# dll を使用しています。コンパイラは、エラー C2872「Foo はあいまいなシンボルです」を返します。

ヘッダーファイルのクラス定義が特定の名前空間にネストされていないため、ネイティブクラス「Foo」がどの名前空間で定義されているかわかりません。したがって、クラス「Foo」は名前空間にない可能性があると思います(C++では可能ですよね?)。それ以外の場合は、クラス「Foo」とその名前空間を指定して、コンパイラに固有のものにします。

「Bar.dll」で使用されている名前空間「Foo」の名前を変更する可能性がありますが、名前空間を維持する別のソリューションを探しています。実際、クラスと名前空間は異なる要素ですが、c++/cli コンパイラではそうではないと思いますか?

Thx 前もってミクベック

4

3 に答える 3

2

これが機能するかどうかはわかりませんが、試してみる価値はあります。

namespace FooNamespace = Foo;
typedef Foo FooClass;

名前空間ディレクティブは、クラスではなく名前空間でのみ有効です。typedef を使用すると、その逆になります。FooClassコードでandを使用できるはずFooNamespaceです。

于 2011-03-29T23:05:02.353 に答える
1

変更するには費用がかかりすぎる巨大な独自のコードベースで、同様の問題に遭遇しました。次のことを試してみると、問題が発生するようです。

using namespace System;

私が含めているコードにはたまたま独自の Enum クラスがあり、「システム」名前空間の使用を開始すると、2 つの名前が衝突します。これを解決するには、これを名前空間 { } 見出しの中に入れます。

namespace MyNamespace
{
    using namespace System;

    ...
}

これは #using ディレクティブでは機能しない可能性がありますが、試してみる価値はあります。

#using "Bar.dll"

namespace MyNamespace
{

    using namespace System;
    using namespace Foo;

    ...
}
于 2011-03-29T22:53:38.493 に答える
1

クラス「Foo」の typedef (Courtesy David Yaw) に加えて、クラス「Foo」のグローバル名前空間 ::Foo を使用することで問題を解決できます。そのため、コンパイラはこのクラスと "Bar.dll" 内の名前空間 "Foo" を区別できます。

于 2011-03-30T08:30:02.700 に答える