繁体   English   中英

为什么使用命名空间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> 但是,如果我不使用namespace 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:: 它足够短,可以输入,它将为您节省痛苦的世界。

高级用户在函数范围使用声明时有一些原因,例如,当您想要从标准库重载函数(例如swap )以使用您自己的数据类型(在他们自己的命名空间内)时。 请参阅此问答 ,了解其工作原理。

string名称空间 std声明。 您有三种方法可以处理位于不同命名空间内的类:

  1. 通过始终编写<namespace>::<class>
  2. 通过明确声明对<class>任何引用实际上意味着1.上面: using <namespace>::<class>;
  3. 通过声明任何对当前命名空间中无法解析的<class>引用也应该在另一个命名空间中查找: using namespace <namespace>;

这些按表现力的降序排序。 虽然在任何地方编写完全清楚,但如果您不熟悉所使用的(可能的多个)命名空间,则可能需要对头部进行查找和刮擦。

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

但是,您永远不应该在头文件中using ... ,因为您不仅要弄乱标题中的命名空间解析,还要包括标题中的每个人的命名空间解析。 这会导致命名空间冲突,奇怪的错误取决于包含的顺序和许多其他令人头疼的问题。 只是不要。

一般来说,虽然在实施文件中有选项1​​和2.有一些专业和参与,但选项3对于以后必须使用您的源的任何人来说都是冒犯性的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM