2011-03-28 16 views
2

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

ネイティブクラス "Foo"がどのネームスペースで定義されているかはわかりませんが、ヘッダーファイル内のクラス定義は特定のネームスペースにネストされていません。だから私は、クラス "Foo"はネームスペースにないかもしれないと仮定します(これはC++で可能ですか?)。それ以外の場合は、コンパイラ固有の名前空間を持つクラス "Foo"を指定します。

"Bar.dll"で使用されている名前空間 "Foo"の名前を変更する可能性がありますが、名前空間を維持する別の解決策を探しています。実際にはクラスと名前空間は異なる要素ですが、C++/cliコンパイラではありません。私は変更するにはあまりにも高価である巨大な独自のコードベースと同様の問題に遭遇してきた事前 で

ThxをMichbeck

答えて

1

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

namespace FooNamespace = Foo; 
typedef Foo FooClass; 

namespaceディレクティブは、クラスではなく名前空間でのみ有効です。 typedefとの逆も同様です。あなたのコードにFooClassFooNamespaceを使用できるはずです。

+0

はい、このtypedefが機能します。挨拶 – Michbeckable

1

。問題は、私は次のことをしようとすると、私のためにポップアップするようだ:

using namespace System; 

私は含めているコードは、独自の列挙型クラスを持つことが起こる、とあなたは「システム」の名前空間を使用して起動した場合、2人の名前衝突。これを解決するために、私は単にこれを名前空間{}の見出しの中に入れます。

namespace MyNamespace 
{ 
    using namespace System; 

    ... 
} 

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

#using "Bar.dll" 

namespace MyNamespace 
{ 

    using namespace System; 
    using namespace Foo; 

    ... 
} 
1

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

関連する問題