2

次の問題に直面しています。

私のインターフェイスは C# で定義されています。インターフェイスでカスタム列挙型を使用しています。一部の列挙型は、それらが返すデータ型と同じ名前を持っています。例:

Foo Foo { get; }
Bar Bar { get; }

C++ でモジュールを使用するには、tlbexp を使用します。データ型と名前を共有するプロパティの名前は、"Name" から "_Name" に変更されます。

Bar myEnumValue = pFoo->Bar // 存在しません

Bar myEnumValue = pFoo->_Bar // は私の 'Bar' プロパティです

これまでのところ、その理由と、これを防ぐことができるかどうか、またはその方法についてのドキュメントは見つかりませんでした。ビルドまたはエクスポート中に警告が表示されません。モジュールを直感的に使用するために、プロパティまたは列挙型の名前を変更したくありません。

なぜこれが起こるのか誰にも説明できますか?

4

1 に答える 1

1

C++ では、これは許可されていません。

class B {};
class A {
    B B;
};

のため[basic.scope.class] 3.3.7/1:

クラス S で使用される名前 N は、そのコンテキスト内で同じ宣言を参照し、S の完全なスコープで再評価される場合に参照する必要があります。この規則違反の診断は必要ありません。


これはクラス内の宣言にのみ適用されることに注意してください。名前空間スコープまたは関数スコープの場合、ルールはより複雑になります。許可される場合B B;と許可されない場合があります。


更新:実際、これは完全に有効です:

class B {};
class A {
    ::B B;
};

tlbexpしたがって、このようなコードを生成してみることができます。

于 2014-10-17T09:08:49.620 に答える