如何解决具有相同名称的两个冲突的命名空间

时间:2012-07-14 02:55:27

标签: c++ namespaces

我在自己的代码中有一个命名空间 core ,它与我正在使用的动态库的命名空间 core 冲突。问题出现是因为我无法修改其中任何一个。第一个核心因为是我们团队项目的一部分,第二个因为是库的一部分。有没有办法解决这种情况?

3 个答案:

答案 0 :(得分:6)

尝试将核心命名空间转换为子命名空间。

编辑:清理答案并添加代码。 (在手机上很难做到!)

通过这种方式,您可以访问每个“核心”命名空间。这也明确地显示了被引用的“核心”。即使外部库具有相同的功能名称,也是安全的。

但是,您提到您实际上无法更改原始代码中的任何内容,因此您唯一的选择是使用不同的库并希望它没有“核心”命名空间。在我看来,说服你的团队改变他们的代码可能会更容易。

// Your 'core' namespace, inside your own namespace.
namespace Mygame
{
  namespace core
  {
    void Foo();
  }
}

// Access both namespaces safely.
Mygame::core::Foo();
core::Foo();

答案 1 :(得分:1)

您将需要更改您有权访问的命名空间的名称。这样的情况是为什么给你创建的东西(类,库,命名空间......)一个好主意,这个前缀可以将它们与可能使用类似名称的其他项区分开来。

例如,如果我有游戏经理,我不会只调用班级Manager。我将其称为MygameGameManager或类似的东西,以区别于其他类 - 即。如果有人稍后出现并在项目中添加SoundManager。重要的是在命名约定中找到平衡,使事物清晰明确,并在命名中过于冗长。余额在那里,你只需要找到它!

答案 2 :(得分:1)

更改

namespace core {
    // define namespace members
}

namespace myproject_core {} // namespace "declaration"
using namespace core = myproject_core; // "namespace alias"

// core:: refers only to your code now

namespace myproject_core {
    // define namespace members
}

现在链接器将看不到任何冲突,并且您的代码将看不到名称更改。


  

问题出现是因为我无法修改其中任何一个。

好吧,如果你不能修改任何东西那么就没有解决方案。我在这个答案中做了一个假设,但也许你可以澄清哪种变化是可以接受的?