【问题标题】:C++/CLI - Ambiguous symbol of a namespace and a classC++/CLI - 命名空间和类的模棱两可的符号
【发布时间】:2011-03-28 09:18:57
【问题描述】:

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

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

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

提前谢谢 米贝克

【问题讨论】:

    标签: c++-cli ambiguous


    【解决方案1】:

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

    namespace FooNamespace = Foo;
    typedef Foo FooClass;
    

    命名空间指令仅对命名空间有效,对类无效。与 typedef 反之亦然。您应该可以在代码中使用FooClassFooNamespace

    【讨论】:

      【解决方案2】:

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

      using namespace System;
      

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

      namespace MyNamespace
      {
          using namespace System;
      
          ...
      }
      

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

      #using "Bar.dll"
      
      namespace MyNamespace
      {
      
          using namespace System;
          using namespace Foo;
      
          ...
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-08-10
          • 2011-03-13
          • 2015-01-30
          • 1970-01-01
          • 1970-01-01
          • 2013-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多