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