在实现中使用“使用命名空间”关键字时,从同一命名空间中调用另一个函数的正确方法是什么?我收到以下错误:
对“酒吧”的调用不明确
编译时:
// Foo.h
namespace Foo
{
    void bar();
    void callBar();
}
// Foo.cpp
#include "Foo.h"
using namespace Foo;
void bar() {/* do something */}
void callBar() {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 文件中提供了bar和的定义。callBar在这种情况下,您应该将函数放在Foo声明它们的命名空间中,而不是使用以下命令导入该命名空间using:
#include "Foo.h"
namespace Foo {
    void bar() {/* do something */}
    void callBar() {bar();}
}
该using namespace指令告诉编译器您要调用函数并从命名空间引用类,Foo而无需明确限定它们的名称;您的文件中可以有多个这样的指令。它不会告诉编译器您在下面提供的定义应该属于 namespace Foo,因此编译器会将它们转储到顶级命名空间中。
最终结果是编译器看到两个bars -Foo::bar()在命名空间中声明Foo,具有外部定义,并::bar()在默认命名空间的 cpp 文件中定义。
你这里有两个bar。一个在命名空间中声明Foo但未定义,另一个在全局命名空间中声明和定义。两者都可以从调用站点访问,因为您正在使用using namespace Foo;,因此编译器的歧义。
如果函数的定义是针对Foo命名空间中的函数,那么您也应该将它们放在那里。
namespace Foo {
     void bar() {/* do something */}
     void callBar() {bar();}
}