2012-05-27 5 views
7

foo.cpp 에서 foo() 함수를 호출 할 수 있습니까? Foo :: foo()를 Foo :: newfoo()로 변경하지 않고도 가능합니다.같은 이름 함수 호출

MAIN.CPP

#include <iostream> 
#include "Foo.hpp" 

class Foo { 
public: 
    void foo() { 
     std::cout << "Foo::foo\n"; 
    } 
    void bar() { 
     std::cout << "Foo::bar\n"; 
     foo();// need to call foo() function from foo.cpp not Foo::foo() 
    } 
}; 

int main() { 
    Foo f; 
    f.bar(); 
    return 0; 
} 

Foo.hpp

#ifndef FOO_HPP_INCLUDED 
#define FOO_HPP_INCLUDED 

void foo(); 

#endif // FOO_HPP_INCLUDED 

foo.cpp의 불쌍한 내 영어에 대한

#include "Foo.hpp" 
#include <iostream> 
void foo(){ 
    std::cout << "foo\n"; 
} 

ps.sorry.

+0

이 문제가 실제로 설명되어 있습니까? 작성된 것처럼, Foo.cpp는'foo'라는 이름의 정의 하나만 보았습니다. 유일한 충돌은'main.cpp'에서'void Foo :: foo()'의 정의 안에 있습니다. 그것이 바로 답이 다루는 것 같습니다. – Potatoswatter

답변

14

자유 함수의 정규화 된 이름을 사용하십시오.

::foo(); 

함수 이름 앞에있는 ::는 전역에 이름 foo()하여 함수를 호출하는 컴파일러를 말한다.
자유 함수 foo()이 다른 일부 네임 스페이스에서 인 경우 네임 스페이스를 지정하는 정규화 된 이름을 사용해야합니다. 단지 이렇게 다른

xyz::foo(); //if foo is defined in xyz namespace 

또는 : 무료 기능 foo 일부 네임 스페이스 xyz에 정의되어있는 경우

namespacename::foo(); 
1

,이 작업을 수행

::foo();  //if foo is defined in the global namespace 

이 하나가 foo에 정의되어 가정 글로벌 네임 스페이스.

구현에 네임 스페이스를 사용하는 것이 좋습니다. 전역 네임 스페이스를 피하십시오.