为什么在我的项目中删除使用命名空间std会导致错误
Why does removing using namespace std cause errors in my project?
我在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
中声明。有三种方法可以对位于不同名称空间中的类进行寻址:
- 总是写
<namespace>::<class>
- 通过显式声明任何对
<class>
的引用实际上意味着1。上图:using <namespace>::<class>;
. - 通过声明任何不能在当前命名空间中解析的
<class>
引用也应该在另一个命名空间中查找:using namespace <namespace>;
按表达能力降序排列。而1。无论写在哪里都很清楚,3。如果您不熟悉所使用的(可能有多个)名称空间,可能需要进行一些查找和挠头。
这些也是按照输入的降序排序的,这就是为什么有些人(尤其是教科书)选择3。
然而,你应该永远不要在头文件中使用using ...
,因为你不仅会干扰头文件中的命名空间解析,还会干扰包括头文件在内的所有文件的命名空间解析。这会导致名称空间冲突、依赖于包含顺序的奇怪错误以及许多其他令人头痛的问题。只是不要。
一般来说,虽然选项1有一些利弊。和2。在实现文件中,选项3。对于以后必须使用你的源代码的人来说,这是一种冒犯。
相关文章:
- 我可以在"std"命名空间中添加推理指南吗?
- 哪些C结构出现在std命名空间中
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 即使在包含 std 命名空间之后,fstream 在 Visual Studio 2017 中也无法正常工作
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 范围运算符需要查找 std 命名空间而不是提升
- C++ 什么时候可以扩展"std"命名空间?
- 如何跳过调试 Visual C++ 2013 中的所有 std 命名空间
- C++余弦在没有 std 命名空间的情况下工作 - 为什么
- 为什么我的日志在 std 命名空间中
- ctime std::命名空间冲突
- 为什么某些函数<cmath>不在 std 命名空间中?
- 在单步执行 std::function 调用时,如何跳过 std 命名空间中的方法调用?(使用 GDB
- 使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀
- isnan 是否在 std:: 命名空间中?更一般地说,何时是 std::必要、可选或要避免
- 在std命名空间中添加模板专用化
- Eclipse CDT插件无法识别某些文件中的std命名空间
- Xcode 找不到'std'命名空间
- 在查找期间在std命名空间中拖动外部命名空间
- 为什么 setjmp 在包含 时不在 std 命名空间中?<csetjmp>