//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()。我的错误在哪里?
//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()。我的错误在哪里?
尝试这个:
这会将实现放入命名空间
//file.c
namespace first
{
namespace second
{
void foo()
{
...
}
}
}
这明确地告诉 main 在哪里可以找到 foo:
//main.c
int main()
{
::first::second::foo();
}
我猜您foo
在发布的示例中尝试从 main 调用时遇到了未解决的链接错误。从顶部开始,这里有几个问题:
foo
存在于命名空间中first::second
。first::second
带入文件范围查找,但不影响函数定义。因此,of 的实现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()
{
// ...
}