【问题标题】:Variable is ambiguous when using namespaces c++使用命名空间c ++时变量不明确
【发布时间】:2019-07-15 11:41:21
【问题描述】:

坐标.h

namespace Coordinates
{
    class Coordinates
    {
    public:
        Coordinates(int x = 0, int y = 0) : x(x), y(y) {}

    private:
        int x;
        int y;
    };
}

平铺.h

#include "Coordinates.h"
#include <vector>

namespace Tile
{
    using namespace Coordinates;

    class Tile
    {
    private:
        std::vector <Coordinates> coordTile;
    };
}

在第二个标题 Tile.h 上,它在 std::vector &lt;Coordinates&gt; coordTile; 处说 Tile::Coordinates 是模棱两可的。如果没有命名空间,程序不会给出任何错误。

【问题讨论】:

  • 歧义是因为您将类命名为与命名空间相同的东西。如果您将 CamelCase 用于类,而将所有小写字母用于命名空间,则很容易避免这种情况。
  • using namespace Coordinates; 在标题中。非常糟糕的主意
  • 我建议您的命名空间可能会进一步简化,如果您将它们都放入 "MyGraphicsLib" ;如果你有 1 个命名空间/类,那么你有点打败命名空间的意义
  • 由于名称冲突,您必须消除歧义:std::vector &lt;::Coordinates::Coordinates&gt; coordTile;
  • @OvidiuFirescu “有人建议我将我的类包装在它自己的命名空间中”我认为这是一些错误的沟通;它应该在“A 命名空间”中 - 也许。小型项目的全局命名空间没有任何问题

标签: c++ namespaces


【解决方案1】:

您有一个命名空间Coordinates 和一个类Coordinates,并且由于您使用了using namespace,这两个名称都在范围内。尽管向量元素类型不能是命名空间,但在编译的特定阶段这仍然是一个歧义。

您的类Coordinates 根本不需要在命名空间Coordinates 中。好的建议是将所有代码放入一个命名空间以“屏蔽”其他人的代码——您可能希望进一步将您的代码组织到多个命名空间中,但是将每个类放在自己的命名空间中没有任何好处,当然你不应该像这样重复使用他们的名字。

【讨论】:

  • 我通过阅读 cmets 了解到我试图做的事情是错误的,我不应该将每个类包装在自己的命名空间中。也不应该对命名空间和类使用相同的名称。谢谢
  • @OvidiuFirescu 是的,cmets 中给出的信息和解决方案应该作为答案发布。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2012-05-07
相关资源
最近更新 更多