如何在不同的文件中使用嵌套命名空间?

时间:2013-07-19 20:17:05

标签: c++ namespaces

//file.h

namespace first
{
  namespace second
  {
     void foo();
  }
}

//file.c
using namespace first::second;

void foo()
{
 ...
}

//main.c
using namespace first::second;
int main()
{
  foo();
}

上面的代码不起作用,因为编译器无法识别foo()。我的错在哪里?

2 个答案:

答案 0 :(得分:1)

试试这个:

这将实现放入命名空间

//file.c
namespace first
{
  namespace second
  {
   void foo()
   {
 ...
    }
  }
}

这告诉主要明确在哪里找到foo:

//main.c
int main()
{
  ::first::second::foo();
}

答案 1 :(得分:1)

当您尝试在发布的示例中从main调用foo时,我猜您有一个未解决的链接错误。从顶部开始,有几个问题在起作用:

  • file.h声明名称空间foo中存在first::second
  • file.c将名称空间first::second带入filescope查找,但不会影响函数定义。因此,void foo() {}的实现实际上是在全局范围内定义的函数 - 而不是first::second正如您所期望的那样。
  • main.c将名称空间first::second带入其文件管理器。当您在main中调用foo时,编译器将考虑first::second以及全局范围::。编译器选择first::second::foo,因为file.h未声明全局foo()
  • 您收到未解决的符号的链接错误,因为first::second::foo从未实现过。

除了Jay的建议之外,您可以做的另一个修复是完全限定foo的定义,类似于成员函数:

// file.c
#include "file.h"

void first::second::foo()
{
  // ...
}