using namespace std; 在头文件中

Reb*_*nix 15 c++ namespaces class header-files

所以,我在规范文件中有以下内容

#include <string>
#include <fstream>
using namespace std:

class MyStuff
{
    private:

    string name;
    fstream file;
    // other stuff

    public:
    void setName(string);
}
Run Code Online (Sandbox Code Playgroud)

我也在实现文件中

#include "MyStuff.h"
using namespace std;

void MyStuff::setName(string name);
{
     name = name
}
Run Code Online (Sandbox Code Playgroud)

在程序文件中我有......

#include <iostream>
#include <string>
using namespace std;

void main()
{
     string name;
     MyStuff Stuff;

     cout << "Enter Your Name: ";
     getline(cin, name);

     Stuff.setName(name);
}
Run Code Online (Sandbox Code Playgroud)

我正在收集应用"using namespace std;" 在头文件中是禁止的,完全符合条件是"更好"的做法; 如std::cout << stuff << endl;

我的理解是,为了使用字符串,它必须具有std命名空间.真的吗?

如果是这样,在头文件中,更加"纯净/干净"来做...

#include <string>

class MyStuff
{
     std::string name;
}
Run Code Online (Sandbox Code Playgroud)

而且,据我所知,目前使用命名空间std; 在所有三个文件,规范,实现和程序中,基本上将三个命名空间层叠在一起,因此如果我string name;在每个文件中单独声明,编译器将不知道哪个属于哪个.真的吗?

我一般都明白,明确是一个"好"的事情,但我对如何的特殊性有点不清楚,而且我最感兴趣的是更深层次的"为什么"这一点.

所以我的直接问题是,在我提供的示例中,描述编译器和行业"标准"功能的"最清晰"方式是什么?而且,您能否指引我更清楚地描述名称空间的推理和实际实现的资源.

Dev*_*lar 12

比方说我string自己宣布一个班级.因为我是一个懒惰的流浪汉,我在全局命名空间中这样做.

// Solar's stuff
class string
{
    public:
        string();
        // ...
};
Run Code Online (Sandbox Code Playgroud)

一段时间后,我意识到,重新使用一些你的代码将有利于我的项目.感谢您将其设为开源,我可以这样做:

#include <solarstuff.hpp>
#include <phoenixstuff.hpp>

string foo;
Run Code Online (Sandbox Code Playgroud)

但突然之间,编译器不再喜欢我了.因为有一个::string(我的类)和另一个 ::string(标准的,由标题包含并带入全局命名空间using namespace std;),所以有各种各样的痛苦.

更糟糕的是,这个问题通过包含我的标题的每个文件得到提升(包括你的标题,哪个......你明白了.)

是的,我知道,在这个例子中,我也应该责怪我自己的命名空间中没有保护自己的类,但那是我提出的ad-hoc.

命名空间用于避免标识符的冲突.您的标头不仅引入MyStuff了全局命名空间,还引入了来自和的每个标识符.我们中的任何一个人实际上都不需要它们中的大多数,所以为什么要将它们拖入全球,污染环境?stringfstream

另外:从维护编码器/调试器的角度来看,foo::MyStuffMyStuff其他地方的命名空间(可能甚至不是相同的源文件)方便十倍,因为您在代码中的那一点获得了命名空间信息需要它.


Kar*_*k T 10

多个实例using namespace std;不会导致任何歧义.问题是该语句将所有名称/类型/函数std导入到命名空间中,现在如果要为类命名string,则会遇到麻烦.使用删除,擦除等功能更有可能发生这种情况.

它在标题中使用是一个更糟糕的程度,因为它传播到.cpp标题的所有s,而没有包含它的人的意识.在.cpp至少使用它需要有意识的选择.

可以得到一个更完整的解释为什么"使用命名空间std"被认为是不好的做法?

可能由此产生的问题示例可以在如何使用迭代器中找到?OP定义一个函数distance,并不断得到错误的答案.又如约用C指针和引用混乱++