【问题标题】:Can a class share a namespace's name?一个类可以共享一个命名空间的名称吗?
【发布时间】:2011-08-16 22:31:19
【问题描述】:

以下 C++ 代码有效吗?

namespace Foo
{
    class Bar
    {
        // Class code here.
    };
}

namespace Foo
{
    namespace Bar
    {
        void SomeFunction();
        {
            // Function code here.
        }
    }
 }

也就是说,可以有一个与类同名的命名空间吗?

【问题讨论】:

标签: c++ class namespaces symbols


【解决方案1】:

“是否可以存在与同名的命名空间?”

,如果它们在同一个命名空间中,就像你的情况一样。

否则,是的。如果它们位于不同的命名空间中,则任何东西都可以与其他任何东西具有相同的名称。请参阅this stackoverflow 线程作为参考。

【讨论】:

  • 不,这个问题是关于在不同的命名空间中使用相同的名称。
  • @Mike:我认为 Ozair 已经回答了 OP 的第二个问题。
  • @quamrana:是的,我确实回答了问题的第二部分。
  • 好的。为了澄清这个答案:如果它们位于不同的命名空间中,任何东西都可以与其他任何东西同名;如果一个类在同一个命名空间中,则它们不能与命名空间同名。
【解决方案2】:

你不能有你的问题的安排,因为没有办法消除 Bar 的歧义。

我的编译器说:

error C2757: 'Bar' : a symbol with this name already exists and therefore this name cannot be used as a namespace name

【讨论】:

  • 编译器不能只检查我是否在 Bar 命名空间或 Bar 类中调用某些东西?
  • @Maxpm:编译器在检查内部之前必须首先消除 Bar 的歧义。如果你调用Foo::Bar::SomeFunction();,那么编译器应该说“OK”还是应该说“Error”——类 Bar 没有成员?
【解决方案3】:

不,但您可以让 SomeFunction 成为 Bar 类的静态成员。

namespace Foo
{
    class Bar
    {
        // Class code here.
        static void SomeFunction()
        {
            // Function code here.
        }
    };
}

结果不是 100% 等同于您想要的(因为 ADL),但限定名称是您所期望的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多