为什么使用命名空间std删除会导致项目中出现错误? 我在C++中有一个标题文件的问题。据我所知,将usingnamespace 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; }; #包括 #包括 //使用名称空间std; 类消息 { 公众: 消息(字符串发送者、字符串接收者、整数时间); void append(); 字符串到_字符串(); 私人: 整数时间; 字符串发送器; 字符串接收者; 字符串文本; };

为什么使用命名空间std删除会导致项目中出现错误? 我在C++中有一个标题文件的问题。据我所知,将usingnamespace 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; }; #包括 #包括 //使用名称空间std; 类消息 { 公众: 消息(字符串发送者、字符串接收者、整数时间); void append(); 字符串到_字符串(); 私人: 整数时间; 字符串发送器; 字符串接收者; 字符串文本; };,c++,string,header,namespaces,using-directives,C++,String,Header,Namespaces,Using Directives,我确实包括了。但是,如果我不使用namespace std,我的所有字符串都会显示错误。我不想在头文件中使用namespace std添加,因为这是一个糟糕的设计。那么我该如何修复它呢 提前谢谢。只要到处写std::string #include <iostream> #include <string> //using namespace std; class Messages { public: Messages(std::string sender, std::st

我确实包括了
。但是,如果我不使用namespace std,我的所有字符串都会显示错误。我不想在头文件中使用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;

};
#包括
#包括
//使用名称空间std;
类消息
{
公众:
消息(std::string发送方,std::string接收方,int-time);
void append();
std::string to_string();
私人:
整数时间;
std::字符串发送器;
std::字符串接收者;
std::字符串文本;
};
经验法则是:无论何时(甚至在.cpp文件中)使用标准库中的任何数据类型或算法,只要在其前面加上
std::
。它足够简短,可以打字,而且它会帮你省去一个痛苦的世界


高级用户在函数作用域中使用using声明有一些原因,例如,当您希望从标准库中重载函数(例如
交换
)以使用您自己的数据类型(在他们自己的名称空间中)时。例如,请参见如何工作。

字符串
在命名空间
std
中声明。有三种方法可以寻址位于不同命名空间中的类:

  • 总是写
  • 通过明确声明对
    的任何引用实际上意味着1。上面:
    使用:
  • 通过声明对当前命名空间中无法解析的
    的任何引用也应在其他命名空间中查找:
    使用命名空间
  • 这些按表达能力的降序排列。而1。无论写在哪里都非常清楚,3。如果您不熟悉所使用的(可能有多个)名称空间,则可能需要进行一些查找和搔头

    它们也按所涉及的打字顺序降序排列,这就是为什么有些人(尤其是教科书)选择3

    但是,您应该永远不要在头文件中使用
    using…
    ,因为您不仅会弄乱头文件中的名称空间解析,还会弄乱包括头文件在内的所有人的名称空间解析。这会导致名称空间冲突、奇怪的错误(取决于包含的顺序)以及许多其他令人头痛的问题。别这样


    总的来说,虽然选项1有一些正反两面。二,。在实现文件中,选择3。对于以后必须使用您的源代码的任何人来说,这都是一种冒犯。

    只需编写
    std::string
    而不是
    string
    指定命名空间:
    std::string
    。使用命名空间std…@ HONK-D:而不仅仅是C++。几乎所有的教科书都是从这样一个有缺陷的基本方法开始的,它后来破坏了你的工作流程。切换是一件痛苦的事情。@HanutSingh:我个人最讨厌的是使用
    printf()
    作为“hello world”的C教程。我相信
    put()
    确实是一个非常孤独的函数很高兴能帮上忙!