2013-06-27 2 views
2

Каков правильный способ вызова одной функции из другого из того же пространства имен при использовании ключевого слова 'using namespace' в реализации? Я получаю следующее сообщение об ошибке:Вызов функции C++ в пределах того же пространства имен

Call to 'bar' is ambiguous

при компиляции этого:

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

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

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

Выглядит хорошо, должно быть что-то не так ... – duDE

+2

вот почему вы не должны этого делать! –

ответ

6

Оказывается, что вы обеспечиваете определения bar и callBar в файле CPP. В этом случае вы должны поместить функции в пространстве имен Foo, где они объявлены, а не импортировать это пространство имен с using:

#include "Foo.h" 

namespace Foo { 

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

} 

директива using namespace сообщает компилятор, что вы хотите, чтобы вызывать функции и относятся к классам от namespace Foo без однозначного определения их имен; вы можете иметь несколько таких директив в своем файле. Он не сообщает компилятору, что приведенные ниже определения должны принадлежать пространству имен Foo, поэтому компилятор выгружает их в пространство имен верхнего уровня.

Конечным результатом является то, что компилятор видит два bar С - Foo::bar() объявленную в Foo пространстве имен, с внешним определением и ::bar(), определенные в файле CPP в пространстве имен по умолчанию.

+0

Ага, это имеет смысл! Благодаря! –

5

У вас есть два bar здесь. один , объявленный в пространстве имен Foo, но не определенный и еще один , объявленный и определенный в глобальном пространстве имен. Оба доступны из сайта вызова, потому что вы используете using namespace Foo;, поэтому двусмысленность для компилятора.

Если определения функций указаны для пространств имен в пространстве имен Foo, тогда их также следует разместить там.

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