c++ - 在一个命名空间中声明并在 C++ 中的另一个命名空间中定义

标签 c++ namespaces declaration qualified-name

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

namespace B{
    void func();
}
void B::func(){
    std::cout<<"abcdef\n";
}
int main(){
    B::func();
}
我们必须使用 B:: 来调用它因为它的 声明 根据对 Forward declaring classes in namespaces 的回答,在 B 命名空间中.
void func();
namespace B{
  void ::func(){

  }
}
using namespace B;
int main(){
  func();
  
} 
根据这些答案,我们不能这样做,因为编译器不知道定义在哪里。
可以安全地说“全局命名空间是特殊的,因为编译器总是检查它,这就是为什么在全局命名空间中定义它是安全的。”?
我们能不能做点什么让用户定义的命名空间像全局命名空间一样特殊,或者做点什么让编译器知道定义在“这里!!”?

最佳答案

全局命名空间包含所有其他用户定义的命名空间。
另一方面,您可以在其封闭的命名空间中定义在命名空间中声明的函数。
来自 C++ 20(9.8.1.2 命名空间成员定义)

2 Members of a named namespace can also be defined outside that namespace by explicit qualification (6.5.3.2) of the name being defined, provided that the entity being defined was already declared in the namespace and the definition appears after the point of declaration in a namespace that encloses the declaration’s namespace.


您的第一个程序示例是正确的,因为全局命名空间包含命名空间 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() { /* ... */ }

关于c++ - 在一个命名空间中声明并在 C++ 中的另一个命名空间中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69184051/

相关文章:

c++ - 组合数组元素 Arduino

variables - 在 swift 中使用哪个声明

objective-c - Objective-C 中的私有(private)方法,在 Xcode 4.3 中我不再需要在我的实现文件中声明它们?

C函数的隐式声明

c++ - OpenCV 错误 : Bad argument (Array should be CvMat or IplImage) in cvGetSize

c++ - 在线下查找特征点

c++ - 返回值优化和构建结构的函数

c++ - 指定不明确/全局命名空间的关键字?

c++ - 你能把库放在命名空间里吗?

c# - 命名空间 'Resources' 中不存在类型或命名空间名称 'MyProject.Properties'