2013-06-27 4 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

당신이 CPP 파일에 barcallBar의 정의를 제공하는 것으로 보인다. 이 경우 오히려 using에 해당 네임 스페이스를 가져 오기보다는, 그들이 선언 된 네임 스페이스 Foo의 기능을 넣어해야합니다

#include "Foo.h" 

namespace Foo { 

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

} 

using namespace 지시자는 함수를 호출하고의 클래스를 참조 할 컴파일러를 알려줍니다 namespace Foo의 이름을 명시 적으로 한정하지 않고; 파일에 이러한 지시문을 여러 개 가질 수 있습니다. 이 아닌 경우은 아래에서 제공하는 정의가 네임 스페이스 Foo에 속해야하므로 컴파일러에서 최상위 네임 스페이스에 덤프합니다. 기본 네임 스페이스에 CPP 파일에 정의 된 외부 정의와 Foo 네임 스페이스에 선언 된 Foo::bar(), 및 ::bar() -

최종 결과는 컴파일러가 두 bar의를 볼 수 있다는 것입니다.

+0

아하, 그 말이 완벽 해! 감사! –

5

여기에 두 개의 bar이 있습니다. 하나의 은 네임 스페이스 Foo에서 선언되었지만으로 정의되지 않았으며 은 글로벌 네임 스페이스에서 선언되고 정의되었습니다. using namespace Foo;을 사용하고 있기 때문에 둘 다 호출 사이트에서 연결할 수 있으므로 컴파일러의 모호성이 있습니다.

함수의 정의가 Foo 네임 스페이스에있는 함수의 정의 인 경우 해당 함수도 함께 넣어야합니다.

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