我在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
,因为它设计不当。那么我该如何解决呢?
提前致谢。
答案 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
中声明。您有三种方法可以处理位于不同命名空间内的类:
<namespace>::<class>
<class>
的任何引用实际上意味着1. using <namespace>::<class>;
。<class>
的任何引用也应在其他命名空间中查找:using namespace <namespace>;
这些按表现力的降序排序。虽然在任何地方编写完全清楚,但如果您不熟悉所使用的(可能的多个)命名空间,则可能需要对头部进行查找和刮擦。
这些也按照打字的降序排序,这就是有些人(特别是教科书)选择3的原因。
但是,您应该永远不会在头文件中使用using ...
,因为您不仅要弄乱标题中的命名空间解析,还要解决每个人的命名空间问题。 你的标题。这会导致命名空间冲突,奇怪的错误取决于包含的顺序和许多其他令人头疼的问题。只是不要。
一般来说,虽然选项1和2.在实现文件中有一些赞成和反对意见,但选项3对于以后必须使用您的源代码的任何人来说都是冒犯性的。