gpt4 book ai didi

C++ - 在你自己的项目中使用你自己的命名空间

转载 作者:行者123 更新时间:2023-11-30 02:20:22 25 4
gpt4 key购买 nike

假设在您自己的项目中您有自己的命名空间。那么您应该如何在 header /CPP 文件中使用“MyNamespace”?

这个有效:

namespace MyNamespace{

class MyClass{

MyClass(MyNamespace::MyClass&) {}
MyClass(MyNamespace::MyOtherClass&) {}


MyNamespace::MyClass& operator=(const MyNamespace::MyClass&) {return *this;}

};

inline void someFunc(MyNamespace::MyClass& obj){};

}

这也行:

namespace MyNamespace{

class MyClass{

MyClass(MyClass&) {}
MyClass(MyOtherClass&) {}

MyClass& operator=(const MyClass&) {return *this;}

};

inline void someFunc(MyClass& obj){};

}

如果我根本不写“MyNamespace::”,就好像我什至没有使用 namespace 一样,尤其是如果“MyOtherClass”来自不同的文件,则使用这一行:

MyClass(MyNamespace::MyOtherClass&) {}

但这确实看起来太多了:

MyNamespace::MyClass& operator=(const MyNamespace::MyClass&) {return *this;}

在 CPP 文件中,我应该使用“using namespace MyNamespace;”吗?或“命名空间 MyNamespace{”?

最佳答案

名称查找从紧邻的范围开始,并逐渐传播到更高的范围,直到找到某些内容。这意味着当你在命名空间 MyNamespace 的定义中时(即 {}namespace MyNamespace { /*...*/ } 之间),MyNamespace 中定义的所有名称可以不合格地使用,名称查找将正确找到它们。这也是最常见的代码编写方式。

因此,在您的情况下,第二个代码示例(标题为“这也适用”的示例)是人们通常期望的 C++ 代码的样子。命名空间应该有助于保持名称的唯一性,而不是妨碍。

请注意,文件(正如您写的“来自不同的文件”)与此无关,真的。在命名空间内,您可以不加限定地引用该命名空间的成员。在命名空间之外,您通常会使用限定来访问命名空间的成员。

异常(exception)情况

有时您可能想要明确地限定一个名称,即使您在它的 namespace 中也是如此。当您想要阻止 Argument-Dependent Lookup 时,就会发生这种情况。 : 当使用非限定名称调用函数时,该函数的名称​​也在与提供的参数类型关联的命名空间中查找(1)。如果您阻止这种情况并确保调用命名空间中的函数,请限定其名称。请注意,这主要适用于模板,在编写代码时不知道与模板参数关联的命名空间。

如果遇到歧义,您也可能被迫使用限定词。如果您不加选择地使用 using “污染”您的 namespace /范围,就会发生这种情况。指令和/或 using声明。更好的解决方案是避免使用此类结构来“减少键入”,并且仅在您真正需要它们的完整语义时才使用它们。


(1)这允许像 std::operator << 这样的事情例如,当其中一个参数是std::cout .

关于C++ - 在你自己的项目中使用你自己的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791013/

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