我遇到以下问题:
我的界面是用C#定义的。我在界面中使用自定义枚举。一些枚举与它们返回的数据类型具有相同的名称,例如:
Foo Foo { get; }
Bar Bar { get; }
我使用tlbexp在C ++中使用该模块。 与其数据类型共享其名称的属性将从“名称”重命名为“_Name”:
Bar myEnumValue = pFoo-> Bar //不存在
Bar myEnumValue = pFoo-> _Bar //是我的'Bar'-Property
到目前为止,我没有找到任何关于原因以及是否/如何防止这种情况的文档。 在构建或导出期间,我没有收到任何警告。 为了直观地使用我的模块,我不想重命名属性或枚举。
任何人都可以解释为什么会这样吗?
答案 0 :(得分: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
生成这样的代码。