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

C++ function call within same namespace

本文关键字:调用 C++ 函数 命名空间      更新时间:2023-10-16

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

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

#include "Foo.h"
namespace Foo {
    void bar() {/* do something */}
    void callBar() {bar();}
}

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

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

这里有两个bar。一个在命名空间Foo中声明但未定义,另一个中声明并定义。两者都可以从调用站点访问,因为您使用的是using namespace Foo;,因此编译器存在歧义。

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

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