可以放在命名空间中的完整法律实体是什么?

时间:2011-08-04 10:29:58

标签: c++

我正在学习C ++。可以放在命名空间中的完整法律实体是什么?

此处的法律实体是指名称空间的有效成员

哦,这是一个真正的问题。我来自.net,我有.net心态。

3 个答案:

答案 0 :(得分:2)

任何代码都可以放在命名空间内。

但是main()函数必须在全局命名空间不能放在用户定义的命名空间内。

namespace userns
{
  int main() 
  {
     return 0; 
  }
}

此程序不会编译链接:http://www.ideone.com/k6SPc

因为userns::main()不会被视为该计划的切入点;它变得像任何其他用户功能一样,而不是标准main()。要成功编译它,您需要在全局命名空间添加main()

namespace userns
{
  int main() 
  {
     return 0; 
  }
}

int main() 
{
     return 0; 
}

现在将编译链接:http://www.ideone.com/76Ynu

答案 1 :(得分:1)

任何东西都可以放在命名空间中(当然这对于C++是合法的。)

实际上,如果没有指定,一切都在某个命名空间中 - 全局命名空间。

答案 2 :(得分:0)

除了少数“实体”之外,所有内容都可以放在namespace中,无法编译

(1)全球超载operator newoperator delete

namespace N
{
  void* operator new (size_t size) // error
  { ... }
}

(2)在namespace的外部范围内声明的结构的定义;例如,您在全局范围内声明了class A,那么您无法在namespace N内定义其方法。同样,如果您在namespace N中声明了方法,则无法将其定义放在namespace N::Nested内(即NestedN内的命名空间。)

//file
struct A {
  void foo ();
  static int i;
};

namespace N
{
  int A::i = 0; // error
  void A::foo()  // error
  {}
}

演示:this is not allowed

我记得至少从我的经验中得出这两个限制。不知道规格。