2012-05-27 23 views
7

関数名Foo :: foo()をFoo :: newfoo()に変更することなく、Foo.cpp からfoo()関数を呼び出すことは可能ですか?同じ名前の関数を呼び出す

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()が他の名前空間でだった場合は、名前空間を指定する完全修飾名を使用する必要があります。

namespacename::foo(); 
1

フリー機能fooは、その後、これを行う、いくつかの名前空間xyzに定義されている場合:この1はfooを定義したと仮定し

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

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

か、他はちょうどこれを行いますグローバル名前空間。

実装には名前空間を使用することをお勧めします。グローバル名前空間の汚染を避けます。

関連する問題