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

时间:2013-05-22 08:21:50

标签: c++ string header namespaces using-directives

我在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,因为它设计不当。那么我该如何解决呢?

提前致谢。

2 个答案:

答案 0 :(得分:5)

只需在任何地方写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)以使用您自己的数据类型(在它们自己的命名空间内)时。参见例如this Q&A如何运作。

答案 1 :(得分:3)

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

  1. 始终撰写<namespace>::<class>
  2. 明确声明对<class>的任何引用实际上意味着1. using <namespace>::<class>;
  3. 通过声明对当前命名空间中无法解析的<class>的任何引用也应在其他命名空间中查找:using namespace <namespace>;
  4. 这些按表现力的降序排序。虽然在任何地方编写完全清楚,但如果您不熟悉所使用的(可能的多个)命名空间,则可能需要对头部进行查找和刮擦。

    这些也按照打字的降序排序,这就是有些人(特别是教科书)选择3的原因。

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

    一般来说,虽然选项1和2.在实现文件中有一些赞成和反对意见,但选项3对于以后必须使用您的源代码的任何人来说都是冒犯性的。