C ++ / CLI - 命名空间和类的不明确符号

时间:2011-03-28 09:18:57

标签: c++-cli ambiguous

我尝试编译C ++ / CLI文件,包括头文件(本机,第三方),其中定义了类“Foo”。此外,我通过#using“Bar.dll”使用C#dll,其中定义了名称空间“Foo”。编译器给出错误C2872“Foo是模糊符号”。

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

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

提前谢谢 Michbeck

3 个答案:

答案 0 :(得分:2)

我不确定这是否有效,但值得一试。

namespace FooNamespace = Foo;
typedef Foo FooClass;

namespace指令仅对名称空间有效,而不对类有效。与typedef相反。您应该可以在代码中使用FooClassFooNamespace

答案 1 :(得分:1)

我遇到了一个类似的问题,一个巨大的专有代码库,它太昂贵了,不能改变。当我尝试以下操作时,似乎会出现这个问题:

using namespace System;

我所包含的代码碰巧有自己的Enum类,如果你开始使用“System”命名空间,那么这两个名字就会发生冲突。要解决这个问题,我只需将其放在命名空间{}标题内。

namespace MyNamespace
{
    using namespace System;

    ...
}

这可能不适用于#using指令,但可能值得一试。

#using "Bar.dll"

namespace MyNamespace
{

    using namespace System;
    using namespace Foo;

    ...
}

答案 2 :(得分:1)

除了“Foo”类(由David Yaw提供)的typedef之外,可以通过使用类“Foo”::: Foo的全局命名空间来解决问题。因此,编译器可以区分此类和“Bar.dll”

中的命名空间“Foo”