在实现中使用'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();}
答案 0 :(得分:6)
您似乎在cpp文件中提供了bar
和callBar
的定义。在这种情况下,您应该将函数放在声明它们的名称空间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();}
}