0

就像我们可以在命名空间中声明并在全局命名空间中定义一样,像这样:

namespace B{
    void func();
}
void B::func(){
    std::cout<<"abcdef\n";
}
int main(){
    B::func();
}

我们必须使用它来调用它,B::因为它是在 B 命名空间中声明的,这是根据Forward declaring classes in namespaces的答案。

void func();
namespace B{
  void ::func(){

  }
}
using namespace B;
int main(){
  func();
  
} 

根据这些答案,我们不能这样做,因为编译器不知道定义在哪里。

可以安全地说“全局命名空间是特殊的,因为编译器总是检查它,这就是为什么在全局命名空间中定义它是安全的。”?

我们可以做一些事情来使用户定义的命名空间与全局命名空间一样特殊,或者做一些事情来让编译器知道定义是“here!!”吗?

4

1 回答 1

2

全局命名空间包含所有其他用户定义的命名空间。

另一方面,您可以在其封闭的命名空间中定义在命名空间中声明的函数。

从 C++ 20 (9.8.1.2 命名空间成员定义)

2 命名命名空间的成员也可以通过显式限定(6.5.3.2)被定义的名称在该命名空间之外定义,前提是被定义的实体已经在命名空间中声明并且定义出现在声明点之后包含声明的命名空间的命名空间

第一个您的程序示例是正确的,因为全局命名空间包含命名空间 B。

第二个您的程序示例无效,因为用户定义的命名空间 B 没有包含声明函数 func 的全局命名空间。

这是一个例子。如果您在命名空间 C 中有以下函数声明

namespace A
{
    namespace B
    {
        namespace C
        {
            void f();
        }
    }
}

那么它可以定义为以下方式之一

namespace A
{
    namespace B
    {
        namespace C
        {
            void f();
        }
        void C::f() { /* ... */ }
    }
}

或者

namespace A
{
    namespace B
    {
        namespace C
        {
            void f();
        }
    }
    void B::C::f() { /* ... */ }
}

或者

namespace A
{
    namespace B
    {
        namespace C
        {
            void f();
        }
    }
}
void A::B::C::f() { /* ... */ }
于 2021-09-14T20:45:43.423 回答