4

在实现中使用“使用命名空间”关键字时,从同一命名空间中调用另一个函数的正确方法是什么?我收到以下错误:

对“酒吧”的调用不明确

编译时:

// Foo.h
namespace Foo
{
    void bar();
    void callBar();
}

// Foo.cpp
#include "Foo.h"
using namespace Foo;

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

2 回答 2

7

您似乎在 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 文件中定义。

于 2013-06-27T10:42:33.353 回答
5

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

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

namespace Foo {
     void bar() {/* do something */}
     void callBar() {bar();}
}
于 2013-06-27T10:43:31.120 回答