【问题标题】:Declaring in one namespace and Defining in other namespace in c++在一个命名空间中声明并在 C++ 中的另一个命名空间中定义
【发布时间】:2021-11-10 00:11:08
【问题描述】:

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

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!!”吗?

【问题讨论】:

  • 第一个和第二个答案取决于您的排序。其他用户可能会有所不同。带有“绿色勾号”的那个是公认的答案。虽然也接受的答案可以改变。最好包含指向答案的链接。答案下方:分享
  • 请每个问题回答一个问题。 &gt; 用于引号,最好只用于引号

标签: c++ namespaces declaration qualified-name


【解决方案1】:

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

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

来自 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() { /* ... */ }

【讨论】:

  • _9.1.8.2 NS 成员定义和示例说明了!!!谢谢。我会仔细检查修改并确保不再重复同样的错误
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多