C++ “使用名称空间标准”和“名称空间标准”之间的区别?

C++ “使用名称空间标准”和“名称空间标准”之间的区别?,c++,C++,这是我的密码: #ifndef DATE_H_ #define DATE_H_ namespace std { class Date { public: Date(); virtual ~Date(); }; } /* namespace std */ #endif /* DATE_H_ */ 我为我的作业创建了上课日期,它创建了 名称空间std{……}。我不知道它的用途。 为什么没有像往常一样使用名称空间std编写; 区别是什么?您的代码在

这是我的密码:

#ifndef DATE_H_
#define DATE_H_

namespace std {

class Date {
    public:
       Date();
       virtual ~Date();
    };

} /* namespace std */

#endif /* DATE_H_ */
我为我的作业创建了上课日期,它创建了 名称空间std{……}。我不知道它的用途。 为什么没有像往常一样使用名称空间std编写;
区别是什么?

您的代码在名称空间std中声明了您的类日期,即您的类完全限定名将是std::Date

声明

using namepace std;
搜索符号时将包含命名空间std

一些补充说明:

该标准明确指出,向std名称空间添加内容可能导致未定义的行为,这不仅是一种不好的做法,而且超出了标准。有关详细讨论,请参阅。 在*.h或任何包含在多个文件中的文件上使用名称空间不是一个好做法。。。因为当符号解析到错误的名称空间时,它可能会产生意外的副作用。
首先:永远不要在std名称空间中放置任何内容

namespace foo
{
  class A {};
}
将类A放入命名空间foo中,因此其全名为foo::A

意味着您可以访问foo中的所有内容,而无需使用限定符foo::。 请注意,使用名称空间通常是不受欢迎的,可能会导致许多意想不到的问题。 最重要的是,不要写在标题中

如果你说

using namespace foo;

class A{};

A不在foo内部,而是在全局名称空间中。

从技术上讲,您可能希望在std名称空间中专门化std::swap。@ChrisDrew我认为这个问题已经解决了,所以我们不再需要那个黑客了。这不仅仅是不好的做法:它是被禁止的。@LightnessRacesinOrbit用您的建议完善了答案。
using namespace foo;

class A{};