2012-05-27 27 views
7

Czy można wywołać funkcję foo() z Foo.cpp bez zmiany nazwy funkcji Foo :: foo() na Foo :: newfoo().wywoływanie tej samej funkcji nazwy

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 na mój biedny język angielski.

+0

Czy to naprawdę ilustruje problem? Jak napisano, Foo.cpp widzi tylko jedną definicję nazwy 'foo'. Jedynym konfliktem jest definicja 'void Foo :: foo()' w 'main.cpp'. Oto, na co odpowiadają odpowiedzi. – Potatoswatter

Odpowiedz

14

Użyj pełnej nazwy bezpłatnej funkcji.

::foo(); 

:: przed nazwą funkcji, informuje kompilator, aby wywołać funkcję o nazwie foo(), który jest w zasięgu globalnym.
Jeśli bezpłatna funkcja foo()była w innym obszarze nazw, należy użyć w pełni kwalifikowanej nazwy określającej obszar nazw.

namespacename::foo(); 
1

Jeśli wolna funkcja foo jest określona w pewnym obszarze nazw xyz, to zrobić:

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

albo po prostu to zrobić:

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

Ten zakłada foo jest zdefiniowany w globalna przestrzeń nazw.

Lepiej jest używać przestrzeni nazw do implementacji. Unikaj zanieczyszczania globalnej przestrzeni nazw.

Powiązane problemy