2015-01-18 12 views
5

आप जब एक वैश्विक नाम स्थान से एक खाका नाम हो रही template कीवर्ड का उपयोग कर सकते हैं:क्या ":: टेम्पलेट" का उपयोग करने का कोई कारण है?

template <class T> void function_template(); 

template <class T> 
void h() 
{ 
    ::template function_template<T>(); 
} 

int main() { h<int>(); } 

लेकिन इस कोड के बिना यह संकलन कर सकते हैं। ऐसी स्थितियां क्या हैं जिनमें कोई ऐसा करना चाहेगा?

+0

@KerrekSB लेकिन 'function_template' * वैश्विक नेमस्पेस * का सदस्य है और यह कोड इसके बिना संकलित कर सकता है। –

+0

ओह, क्षमा करें, आपका मतलब विशेष रूप से वैश्विक संस्करण है - तब कभी भी ध्यान न दें। –

उत्तर

8

मैं एक ही स्थान पर के बारे में सोच सकते हैं, लेकिन मैं शायद ही लगता है कि यह आम होगा:

#include <iostream> 

// simpile function template 
template<class T> 
void function_template(T) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

// overload (NOT specialized) 
void function_template(int value) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

int main() 
{ 
    function_template(0);    // calls overload 
    ::function_template(0);    // calls overload 
    ::template function_template(0); // calls template, deduces T 
} 

आउटपुट

void function_template(int) 
void function_template(int) 
void function_template(T) [T = int] 

मैं करने के लिए एक गुमनाम नाम स्थान में इस में से कुछ सामान के लिए जा रहा था वास्तव में :: पर गैर-मामूली अर्थ लाएं लेकिन यह पर्याप्त प्रतीत होता है इसलिए मैंने इसे छोड़ दिया।

+0

[temp.names]/p5 कहता है "कीवर्ड 'टेम्पलेट' द्वारा उपसर्ग एक नाम एक * टेम्पलेट-आईडी * होगा या नाम एक वर्ग टेम्पलेट का संदर्भ देगा।" ':: टेम्पलेट function_template' न तो है, इसलिए यह बीमार होना चाहिए। –

संबंधित मुद्दे

 संबंधित मुद्दे