2012-05-27 1 views
7

E 'possibile chiamare la funzione foo() da Foo.cpp senza cambiare nome di funzione Foo :: foo() a Foo :: newfoo().chiama lo stesso nome funzione

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 per il mio povero inglese.

+0

Questo illustra davvero il problema? Come scritto, Foo.cpp vede solo una definizione del nome 'pippo'. L'unico conflitto è all'interno della definizione di 'void Foo :: foo()' in 'main.cpp'. Questo è ciò a cui sembrano rispondere le risposte. – Potatoswatter

risposta

14

Utilizzare il nome completo della funzione gratuita.

::foo(); 

Il :: davanti al nome della funzione, dice al compilatore di chiamare la funzione con il nome foo() che è in ambito globale.
Se la funzione gratuita foo()era in qualche altro spazio dei nomi, è necessario utilizzare un nome completo che specifica lo spazio dei nomi.

namespacename::foo(); 
1

Se la funzione libera foo è definita in un certo spazio dei nomi xyz, quindi fare questo:

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

oppure solo fare questo:

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

Questo presuppone foo è definito in lo spazio dei nomi globale.

È preferibile utilizzare lo spazio dei nomi per l'implementazione. Evita di inquinare lo spazio dei nomi globale.