在同一命名空间内调用C++函数

4
在实现过程中使用“using namespace”关键字时,从同一命名空间中调用一个函数的正确方法是什么?我得到了以下错误:

对'bar'的调用是模棱两可的

编译以下代码时出现上述错误:
// Foo.h
namespace Foo
{
    void bar();
    void callBar();
}

// Foo.cpp
#include "Foo.h"
using namespace Foo;

void bar() {/* do something */}
void callBar() {bar();}

看起来不错,可能还有其他问题... - Leo Chapiro
3
这正是你不应该这样做的原因! - John Dibling
2个回答

7

看起来你在cpp文件中提供了barcallBar的定义。在这种情况下,你应该把函数放在声明它们的命名空间Foo中,而不是使用using导入该命名空间:

#include "Foo.h"

namespace Foo {

    void bar() {/* do something */}
    void callBar() {bar();}

}
using namespace指令告诉编译器,您想要调用来自名称空间Foo中的函数和类而不显式限定它们的名称;您可以在文件中有多个这样的指令。它不会告诉编译器您提供的定义应属于名称空间Foo,因此编译器会将它们转储到顶级名称空间中。

最终结果是编译器看到两个bar - 声明在Foo名称空间中的外部定义的Foo::bar()和在默认名称空间中定义的::bar()

啊哈,那就很有道理了!谢谢! - Joss

5
你这里有两个bar,一个在命名空间Foo中声明但未定义,另一个在全局命名空间中声明和定义。由于你使用了using namespace Foo;,因此从调用点都可以访问它们,这对编译器来说是模棱两可的。
如果函数的定义是在Foo命名空间中,那么你也应该把它们放在那里。
namespace Foo {
     void bar() {/* do something */}
     void callBar() {bar();}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接