2

我尝试编译一个 C++/CLI 文件,其中包括一个定义了类“Foo”的头文件(本机、第三方)。此外,我通过#using“Bar.dll”使用C# dll,其中定义了命名空间“Foo”。编译器给出错误 C2872 “Foo is ambiguous symbol”。

我不知道本机类“Foo”是在哪个命名空间中定义的,因为头文件中的类定义没有嵌套在某个命名空间中。所以我假设“Foo”类可能不在命名空间中(这在 C++ 中是可能的,不是吗?)。否则,我将指定类“Foo”及其命名空间,以使其特定于编译器。

我可以重命名“Bar.dll”中使用的命名空间“Foo”,但我正在寻找一种不同的解决方案来保留命名空间。实际上一个类和一个命名空间是不同的元素——但我猜不是c++/cli编译器?

提前谢谢米贝克

4

3 回答 3

2

我不确定这是否可行,但值得一试。

namespace FooNamespace = Foo;
typedef Foo FooClass;

命名空间指令仅对命名空间有效,对类无效。与 typedef 反之亦然。您应该能够在您的代码中使用FooClass和。FooNamespace

于 2011-03-29T23:05:02.353 回答
1

我遇到了一个类似的问题,即巨大的专有代码库太昂贵而无法更改。当我尝试以下操作时,这个问题似乎突然出现了:

using namespace System;

我包含的代码恰好有它们自己的 Enum 类,如果您开始使用“System”命名空间,那么这两个名称就会发生冲突。为了解决这个问题,我简单地将它放在命名空间 { } 标题中。

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(由 David Yaw 提供)之外,该问题还可以通过使用“Foo”类的全局命名空间来解决:::Foo。所以编译器可以区分这个类和“Bar.dll”中的命名空间“Foo”

于 2011-03-30T08:30:02.700 回答