//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()。我的错在哪里?
答案 0 :(得分:1)
试试这个:
这将实现放入命名空间
//file.c
namespace first
{
namespace second
{
void foo()
{
...
}
}
}
这告诉主要明确在哪里找到foo:
//main.c
int main()
{
::first::second::foo();
}
答案 1 :(得分:1)
当您尝试在发布的示例中从main调用foo
时,我猜您有一个未解决的链接错误。从顶部开始,有几个问题在起作用:
foo
中存在first::second
。first::second
带入filescope查找,但不会影响函数定义。因此,void foo() {}
的实现实际上是在全局范围内定义的函数 - 而不是first::second
正如您所期望的那样。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()
{
// ...
}