2

我面临以下问题:

我的接口是用 C# 定义的。我在我的界面中使用自定义枚举。一些枚举与它们返回的数据类型具有相同的名称,例如:

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

我使用 tlbexp 来使用 C++ 中的模块。与其数据类型共享名称的属性从“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 回答