C++ 何时需要空的命名空间定义?

C++ 何时需要空的命名空间定义?,c++,namespaces,forward-declaration,C++,Namespaces,Forward Declaration,名称空间不像大多数其他东西那样被声明和定义,但与前向声明等效的名称空间是: namespace X {} // empty body 通常,通过在名称空间中放置其他声明来定义名称空间。但是这个“名称空间转发声明”是最容易解决的问题吗?空名称空间有什么用?这里有一个甚至出现在标准中的名称空间:声明一个using指令来表示名称空间 namespace unique { } using namespace unique; 之后,您可以在其他时间打开名称空间并添加到其中,using指令使内容对外部

名称空间不像大多数其他东西那样被声明和定义,但与前向声明等效的名称空间是:

namespace X {}  // empty body

通常,通过在名称空间中放置其他声明来定义名称空间。但是这个“名称空间转发声明”是最容易解决的问题吗?空名称空间有什么用?

这里有一个甚至出现在标准中的名称空间:声明一个using指令来表示名称空间

namespace unique { }
using namespace unique;

之后,您可以在其他时间打开名称空间并添加到其中,using指令使内容对外部名称空间可见。

我使用空名称空间定义来简化递归函数的声明,其中一个“方面”是运算符重载。操作符被放置在它们自己的名称空间中,以允许根据需要在作用域中有选择地使用,而不是在头包含在任何位置时强制使用(从而在解析变得不明确时强制执行错误)

:

名称空间容器\u插入器{}
模板
无效写入顺序(流与s、Iter开始、Iter结束、,
总施工*首字母、总施工*九月、总施工*末字母)
{
使用名称空间容器插入器;

如果(初始)s我有一个特定的情况,我觉得这很有用。如果在接下来的一两天内没有人回答,我会发布它。我很好奇是否还有其他情况。有趣的问题。+1我想不出这样做会有什么好处(尽管你可能会设计一个病理学的例子)。我很好奇……相关:这在标准中是什么?@Roger 7.3.1.1/1,未命名的namespacesAh,我已经掩盖了这么多次,我应该认识到它。我不知道第二个空命名空间声明在哪里如果是lambda,你将定义什么成员?@Roger类似于
flm:_1
或诸如此类的东西。:)但是我不确定这种用法,所以我要再次删除它。因为将名称空间别名放在头中显然是不好的,而且我在.cpp文件中只看到这种用法的有限用途(如果您在
foo::lambda
中,目前您仍然可以使用非限定名称)。我的用法与使用指令的WRT类似,但用途不同(并打算在有限的范围内使用,与上述不同)。我认为唯一有用的方法是使用指令;在没有其他上下文的情况下,您可以实际使用命名空间。或者,它可以用于“保留”如果对库名称空间的添加没有(程序上而不是形式上)限制(这似乎不是一个好主意)
namespace container_inserters {}

template<class Stream, class Iter, class Ch>
void write_sequence(Stream& s, Iter begin, Iter end,
                    Ch const *initial, Ch const *sep, Ch const *final)
{
  using namespace container_inserters;
  if (initial) s << initial;
  if (begin != end) {
    s << *begin;
    ++begin;
    for (; begin != end; ++begin) {
      if (sep) s << sep;
      s << *begin;
    }
  }
  if (final) s << final;
}

namespace container_inserters {
#define G(N) \
template<class Ch, class Tr, class T, class A> \
std::basic_ostream<Ch,Tr>& operator<<(std::basic_ostream<Ch,Tr> &s, \
                                      N<T,A> const &value) \
{ \
  write_sequence(s, value.begin(), value.end(), "[", ", ", "]"); \
  return s; \
}
G(std::deque)
G(std::list)
G(std::vector)
#undef G
}  // container_inserters::
int main() {
  using namespace std;
  vector<deque<list<int> > > v (3, deque<list<int> >(2, list<int>(1, 42)));

  using namespace container_inserters;
  cout << v << '\n';

  return 0;
}
// output:
//  [[[42], [42]], [[42], [42]], [[42], [42]]]