2012-05-07 13 views
7

を持っている場合は、コンストラクタを呼び出す方法:私は、次のしている場合は機能が同じ名前

class T 
{ 
    public: 
     T(){} 
}; 

void T() 
{ 
} 

int main() 
{ 
    T(); // this calls the function, how can I call the constructor T()? 
} 

を、私はそれを名前を変更することは可能かもしれないので、私は、それでいないすべての問題を持っていますが、私は強制的に可能性がどのように好奇心それはコンストラクタを呼び出すために、また、私は自分自身に、なぜ関数呼び出しがコンストラクタよりも優先順位が高いように思われるかを尋ねています。また、重複した名前に関して警告メッセージが表示されないのはなぜですか?

+0

単純な名前を付けないでください。または、コンストラクタでparensを使用しないでください。 –

+0

@MooingDuck: "do not"それはまともなアドバイスですが、質問に答えません。 – SigTerm

答えて

3

jaunchopanzaが言ったことを、あなたはコール修飾することができほか:

T::T(); 

このバージョンでは、あなたが作成することができます一時:

class T 
{ 
    public: 
     T(){} 
}; 

void foo(T) {} 

void T() 
{ 
} 

int main(){ 
    foo(T::T()); 
} 
+0

私の答えが正しいかどうか分かりません。この関数は少なくとも私のgcc 4.8スナップショットで 'T'デフォルトコンストラクタをマスクしているようです。 – juanchopanza

+0

BTWはあなたのためにコンパイルしますか?もしそうなら、コンパイラは何ですか? – juanchopanza

+0

@juanchopanza、それはG ++およびclang ++(4.4.3および1.1、resp)でコンパイルされます。奇妙なことに 'foo(T :: T :: T :: T :: T :: T :: T());' –

0

基本的には、衝突が名前ではない、基本的には、があります別の名前空間にある

T() ==> namespace::T() It;s a function call not an object instantiation. 
T a() ==> namespace ::T::T() It;s is instantiation of T class calling the constructor. 
T a() ; a() ==>namespace ::T::T()::() It;s call the functor of the T Class (need to define the operator())  
関連する問題