gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:59:42 24 4
gpt4 key购买 nike

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

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 thatnamespace by explicit qualification (6.5.3.2) of the name beingdefined, provided that the entity being defined was already declaredin the namespace and the definition appears after the point ofdeclaration in a namespace that encloses the declaration’snamespace.


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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com