代码之家  ›  专栏  ›  技术社区  ›  Anna B

如何解决C++中两个库之间的命名冲突?

  •  2
  • Anna B  · 技术社区  · 14 年前

    我正在使用两个大型库(GUI&网络)我可以很高兴地做

    using namespace FirstLib;
    using namespace SecondLib;
    

    除了一个名为 Foobar 名字冲突的地方。

    FirstLib::Foobar . 有没有一种方式可以说“在我的代码中,当你看到 ,想想 SecondLib::Foobar ?

    7 回复  |  直到 14 年前
        1
  •  6
  •   Kornel Kisielewicz    14 年前

    using namespace evil ! 名称空间是 为了防止像你这样的问题!但也就是说,试着:

    using namespace FirstLib;
    using namespace SecondLib;
    using SecondLib::Foobar;
    

    甚至(对于某些编译器):

    using namespace FirstLib;
    using namespace SecondLib;
    typedef SecondLib::Foobar Foobar;
    
        2
  •  2
  •   Anna B    14 年前

    已用类名列表 C++faq (我本该先看看的地方)。

    如果我们不能说

    包括所有 FirstLib ,但删除 SecondLib::Foobar

    using-declarations 我们需要的确切元素包括:

    using FirstLib::Boids;
    using FirstLib::Life;
    // no using FirstLib::Foobar...
    
        3
  •  1
  •   Ana Betts    14 年前

    您必须从这些名称空间中选择一个,去掉“using”,并显式地调用所有类名。C有一个办法,但是C++没有实现。

        4
  •  1
  •   SoapBox    14 年前

    你基本上回答了你自己的问题。必须明确说明要使用哪个类,因此必须这样做 SecondLib::Foobar 无论何时使用该类。

        5
  •  1
  •   UncleBens    14 年前

    typedef Lib2::FooBar FooBaz;
    

    我想,对于冲突函数,可以使用函数指针“重命名”冲突函数。


    另外,使用声明尊重作用域:您可以使一个名称空间在一个函数中可见,但不能使另一个名称空间可见——假设您甚至不在该函数中使用它。

        6
  •  0
  •   fbrereto    14 年前

    您是否尝试过:

    using SecondLib::Foobar;
    

    ?

        7
  •  0
  •   Community prosti    7 年前

    如果使用将两个命名空间中的所有元素都加载到当前范围 using namespace

    using namespace FirstLib;
    using namespace SecondLib;
    

    这些名称空间中的一些名称可能会发生冲突,然后您需要明确地告诉编译器,在当前范围内,通过使用 using

    using SecondLib::Foobar;
    

    7.3.3使用声明

    1使用声明将引入 这个名字是…的同义词 某些实体在别处声明。

    这一行要求编译器思考 SecondLib::Foobar 每当它看到 Foobar

    这个 使用 指令和声明是非常有用的,但它们可能会导致您正在处理的问题。所以,缩小任何形式的语言的使用范围是个好主意 使用 尽可能缩小范围。您可以使用该指令 在其他命名空间的范围内

    namespace MyApp {
       using namespace ::SecondLib;
    }
    

    甚至是一个函数。这同样适用于 宣言。因此,缩小它们的使用范围是一个好主意:

    void foo()
    {
       ::SecondLib::Foobar fb;
    }
    

    使用名称空间 在标题范围内。看见 Header files usage - Best practices - C++

    我自己的小贴士:当你需要使用这些类型中的任何一种时,一定要使用完全限定