2012-05-07 9 views
7

है यदि:कैसे निर्माता कॉल करने के लिए अगर मैं निम्नलिखित है समारोह में एक ही नाम

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

void T() 
{ 
} 

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

मैं के बाद से मैं यह नाम बदलने के लिए संभव हो सकता है इसके साथ कोई कोई समस्या है, है, लेकिन सिर्फ उत्सुक मैं कैसे मजबूर कर सकता है यह कन्स्ट्रक्टर को कॉल करने के लिए, और मैं खुद से पूछ रहा हूं कि फ़ंक्शन कॉल को कन्स्ट्रक्टर की तुलना में उच्च प्राथमिकता क्यों दिखाई देती है। इसके अतिरिक्त, डुप्लिकेट नाम के संबंध में कोई चेतावनी संदेश क्यों नहीं है।

+0

सरल, उन्हें वही नाम न दें। या कन्स्ट्रक्टर के साथ माता-पिता का उपयोग न करें। –

+0

@MooingDuck: "नहीं" जबकि यह एक सभ्य सलाह है, यह सवाल का जवाब नहीं देता है। – SigTerm

उत्तर

3

इसके अलावा jaunchopanza क्या कहा, आप कॉल अर्हता प्राप्त कर सकते हैं:

T::T(); 

इस संस्करण के साथ, आप बना सकते हैं temporaries:

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

void foo(T) {} 

void T() 
{ 
} 

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

मुझे यकीन नहीं है कि मेरा जवाब सही था। फ़ंक्शन कम से कम मेरे जीसीसी 4.8 स्नैपशॉट पर 'टी' डिफ़ॉल्ट कन्स्ट्रक्टर को मुखौटा करता है। – juanchopanza

+0

बीटीडब्ल्यू आपके लिए संकलित करता है, और यदि ऐसा है, तो किस कंपाइलर के साथ? – juanchopanza

+0

@juanchopanza, यह G ++ और clang ++ (4.4.3, और 1.1, resp) में संकलित करता है। विचित्र रूप से, तो 'foo (टी :: टी :: टी :: टी :: टी :: टी :: टी()); ' –

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())  
संबंधित मुद्दे