2009-06-30 35 views
14

私はC++でクラスを記述しようとしていましたが、奇妙な問題に遭遇しました。クラスとして。それはちょっと紛らわしいですので、ここでの例です:C++ - クラスと同じ名前のクラス内で関数を呼び出す

void A(char* D) { 
    printf(D); 
} 

class A 
{ 
public: 
    A(int B); 
    void C(); 
}; 

A::A(int B) { 
    // something here 
} 

void A::C() { 
    A("Hello, World."); 
} 

コンパイラは、それがクラス内にあるので、それは、関数A(のchar *)を見つけることができないことを最後の行に2番目に文句を言い、そしてコンストラクタがあり関数と同じ名前。私は次のように、外の別の関数を書くことができます:

ousideA(char* D) { 
    A(D); 
} 

そして:: Cの内側にoutsideAを呼ぶが、これは問題に愚かな解決策のように思えます。誰でもこれを解決するより適切な方法を知っていますか?

答えて

35
::A("Hello, world."); 

はうまくいくはずです。基本的には「グローバル名前空間で見つかったAを使用する」と言っている

2

名前空間を使用することをお勧めします。あなたのクラスを関数とは異なる名前空間に入れてください。

namespace my_namespace1 
{ 

void A() {} 

} 

namespace my_namespace2 
{ 

struct A {}; 

} 


int main() 
{ 
    my_namespace1::A(); 
    my_namespace2::A my_a;  
} 

もちろん、実際の質問は、別の名前のクラスと関数があるのですか?良い簡単なルールは、WithABeginningCapitalLetterという名前のクラスとwithoutOneという名前のクラスを作ることです。そうすれば、この問題は決して起こりません。もちろん、STLはこれをしません...

5

使用scope resolution operator::グローバルスコープから名前にアクセスするには:

void A::C() { 
    ::A("Hello, world."); 
} 
関連する問題