2011-05-25 14 views
5
void fun (char (&a)[2]) // 1D reference 
{} 

template<typename T, int SIZE> 
void funT (T (&a)[SIZE]) // 1D reference 
{} 

int main() 
{ 
    char c[2][2]; // 2D array 
    fun(c); // error 
    funT(c); // ok !!!?? 
} 

मैं उम्मीद कर सकते हैं कि fun() त्रुटि देता है करता है जब -1 डी संदर्भ के साथ 2 डी सरणी प्राप्त करता है, लेकिन कैसे funT() आ ठीक काम करता है! क्या इस तरह के व्यवहार के लिए मानक में कोई संदर्भ है या क्या यह C++ भाषा में है?क्यों एक टेम्पलेट समारोह एक सामान्य कार्य नहीं

+0

समारोह टेम्पलेट में, मुद्रण 'अदालत << sizeof (टी) की कोशिश << endl; '.. यह' 2' प्रिंट करेगा ... जो दिखाता है कि 'टी'' char' नहीं है, बल्कि कुछ और है। इसका 'char [2] '। – Nawaz

+0

यह ध्यान रखना महत्वपूर्ण है कि 'char c [2] [2] '2 आयामी सरणी नहीं है, बल्कि एक आयामी सरणी की एक आयामी सरणी है। तर्क की यह पंक्ति समस्या को सरल समझती है। 'सी' एक 1 डी सरणी है, सिर्फ' char' –

उत्तर

11

क्योंकि c का प्रकार char [2] नहीं है, यह पहले फ़ंक्शन से मेल नहीं खाता है। टेम्पलेट मामले में, Tchar [2] पर हल करता है, जिसका अर्थ है कि अंतिम तर्क प्रकार char (&a)[2][2] है। (आप एक typedefchar[2] करने के बराबर होता जा रहा यह सोच सकते हैं T के रूप में, और तर्क पर आधारित है कि प्रकार का विस्तार करें।)

+0

जो मेरा पहला अनुमान था। मुझे @RedX से पॉइंटर से संबंधित उत्तर से भी आश्चर्य हुआ। – iammilind

1

T char* char[2] हो जाएगी और इस तरह के रूप में वहाँ अपने टेम्प्लेटेड समारोह के साथ कोई समस्या नहीं होनी चाहिए।

संपादित करें: धन्यवाद जेम्स इसे इंगित करने के लिए।

+0

-1 नहीं, क्योंकि उत्तर गलत है। उसके कोड में कहीं भी 'char * 'शामिल नहीं है। –

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