【问题标题】:C++ namespace issues with third party library and same name classes第三方库和同名类的 C++ 命名空间问题
【发布时间】:2013-01-15 21:48:42
【问题描述】:

我在我的项目中定义了一个 Vector2 类

class Vector2
{
public:
    Vector2();
    ~Vector2();
protected:
    float mX;
    float mY;
}

我开始使用一个名为SFML的库

除其他外,它还为我处理绘制形状和图像。

SFML defines it's own Vector2 类。显然,这会导致一些命名空间问题。以下是我的解决方法:

// Using an SFML Vector2
sf::Vector2 sfmlVector;

// Using my Vector2
::Vector2 myVector;

我希望“Vector2”始终被假定为我的 vector2,而“sf::Vector2”始终是 SFML 的 vector2,而不是必须将命名空间放入我的 vector2 或使用更混乱的全局 :: 命名空间。

这个可以吗?

【问题讨论】:

  • 如果你想要这种行为,不要using namespace sf
  • 我也会把你的类放在一个命名空间中。

标签: c++ class namespaces sfml


【解决方案1】:

只要您不在sf 命名空间内添加代码,查找就不会尝试在该命名空间内查找Vector2,而是会找到全局命名空间之一。如果您在 sf 命名空间内添加代码,那么它将首先找到 sf::Vector2... 但我认为代码 in 库应该使用类型 in图书馆。

【讨论】:

  • 嗯,我定义在 sf 命名空间中没有代码。也许我在某个文件中做,然后在包含树下,它首先查看“使用 sf”文件然后翻转出来?我将尝试删除所有“使用 sf”并在执行此操作的文件上手动调用 sf::,看看是否有帮助。
  • 你应该避免使用指令正是因为这个原因:命名空间是分离标识符和避免冲突的工具,使用指令具有相反的效果,因为它们合并命名空间并导致冲突
【解决方案2】:

我仍然会将您自己的 Vector2 类放入您自己的命名空间中,以避免污染全局。但是,在使用该类时,如果每次都指定命名空间很麻烦,您可以使用using declaration,如下所示:

using mynamespace::Vector2;

告诉编译器将 Vector2 解析为文件其余部分(翻译单元)的向量类型。

【讨论】:

  • using 语句很漂亮,特别是因为我包含一个定义并包含很多垃圾的文件,我不想做每个文件(断言、向量等)。但是,我没有将其包含在头文件中。没有办法在全球范围内使用清除?
猜你喜欢
  • 2011-11-10
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 2020-05-02
  • 2014-03-09
  • 2010-12-27
相关资源
最近更新 更多