为什么在我的项目中删除使用命名空间std会导致错误

Why does removing using namespace std cause errors in my project?

本文关键字:std 命名空间 错误 我的 项目 删除 为什么      更新时间:2023-10-16

我在c++中包含头文件有一个问题。据我所知,这不是一个很好的设计,把using namespace std在头,但我得到了一些错误,当我试图删除它。下面是我在头文件中的代码:

#include <iostream>
#include <string>
//using namespace std;
class Messages
{
public:
Messages(string sender, string recipient,int time);
void append();
string to_string();

private:
int time;
string sender;
string recipient;
string text;
};

我确实包括了<string>。但是,如果我不使用命名空间std,我的所有字符串都会显示错误。我不想在头文件中添加using namespace std,因为这是一个糟糕的设计。那么我该如何解决这个问题呢?

到处写std::string

#include <iostream>
#include <string>
//using namespace std;
class Messages
{
public:
Messages(std::string sender, std::string recipient,int time);
void append();
std::string to_string();

private:
int time;
std::string sender;
std::string recipient;
std::string text;
};

就像一个经验法则:无论何时(即使在.cpp文件中),您正在使用标准库中的任何数据类型或算法,只需使用std::作为前缀。它足够简短,可以输入,它将为您省去很多痛苦。

高级用户在函数范围内使用using声明有一些原因,例如当你想重载标准库中的函数(例如swap)以使用你自己的数据类型(在它们自己的命名空间内)时。

string命名空间 std中声明。有三种方法可以对位于不同名称空间中的类进行寻址:

  1. 总是写<namespace>::<class>
  2. 通过显式声明任何对<class>的引用实际上意味着1。上图:using <namespace>::<class>; .
  3. 通过声明任何不能在当前命名空间中解析的<class>引用也应该在另一个命名空间中查找:using namespace <namespace>;

按表达能力降序排列。而1。无论写在哪里都很清楚,3。如果您不熟悉所使用的(可能有多个)名称空间,可能需要进行一些查找和挠头。

这些也是按照输入的降序排序的,这就是为什么有些人(尤其是教科书)选择3。

然而,你应该永远不要在头文件中使用using ...,因为你不仅会干扰头文件中的命名空间解析,还会干扰包括头文件在内的所有文件的命名空间解析。这会导致名称空间冲突、依赖于包含顺序的奇怪错误以及许多其他令人头痛的问题。只是不要。

一般来说,虽然选项1有一些利弊。和2。在实现文件中,选项3。对于以后必须使用你的源代码的人来说,这是一种冒犯。