1
//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()。我的错误在哪里?

4

2 回答 2

1

尝试这个:

这会将实现放入命名空间

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

这明确地告诉 main 在哪里可以找到 foo:

//main.c
int main()
{
  ::first::second::foo();
}
于 2013-07-19T20:23:42.320 回答
1

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

  • file.h 声明一个foo存在于命名空间中first::second
  • file.c将命名空间first::second带入文件范围查找,但影响函数定义。因此,of 的实现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()
{
  // ...
}
于 2013-07-19T20:51:22.397 回答