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

时间:2013-06-27 10:37:43

标签: c++ namespaces

在实现中使用'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();}

2 个答案:

答案 0 :(得分:6)

您似乎在cpp文件中提供了barcallBar的定义。在这种情况下,您应该将函数放在声明它们的名称空间Foo中,而不是使用using导入该名称空间:

#include "Foo.h"

namespace Foo {

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

}

using namespace指令告诉编译器你要调用函数并引用命名空间Foo中的类而不明确地限定它们的名字;你可以在你的文件中有多个这样的指令。它 not 告诉编译器您在下面提供的定义应该属于命名空间Foo,因此编译器会将它们转储到顶级命名空间中。

最终结果是编译器看到两个bar s - 在Foo::bar()命名空间中声明的Foo,带有外部定义,并且在您的cpp文件中定义了::bar()在默认命名空间中。

答案 1 :(得分:5)

这里有两个bar。一个在名称空间Foo中声明但未定义,另一个在全局名称空间中声明和定义。两者都可以从调用站点访问,因为您正在使用using namespace Foo;,因此编译器的模糊性。

如果函数的定义是针对Foo命名空间中的函数的定义,那么你也应该将它们放在那里。

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