2013-05-12 12 views
7

के साथ फ़ंक्शन टेम्पलेट में सरणी कैसे पास करें I C++ टेम्पलेट अवधारणाओं को सीख रहा हूं। मैं निम्नलिखित समझ में नहीं आता।संदर्भ

#include <iostream> 
#include <typeinfo> 

using namespace std; 

template <typename T> 
T fun(T& x) 
{ 
cout <<" X is "<<x; 
cout <<"Type id is "<<typeid(x).name()<<endl; 
} 


int main (int argc, char ** argv) 
{ 
    int a[100]; 
    fun (a); 
} 

मैं क्या कोशिश कर रहा हूं?

1) टी मज़ा (टी & एक्स)

यहाँ एक्स एक संदर्भ है, और इसलिए 'एक' सूचक प्रकार, में लेकिन जब संकलन, मैं निम्न त्रुटि हो रही है सड़ा हुआ नहीं होंगे।

error: no matching function for call to ‘fun(int [100])’ 

जब मैं गैर संदर्भ का प्रयास करता हूं, तो यह ठीक काम करता है। जैसा कि मैं समझता हूं कि सरणी सूचक प्रकार में क्षीण हो जाती है।

उत्तर

16

सी-स्टाइल सरणी बहुत ही बुनियादी संरचनाएं हैं जो अंतर्निहित, प्रतिलिपि या संदर्भित नहीं हैं, अंतर्निहित या उपयोगकर्ता परिभाषित प्रकार हैं। ,

// non-const version 
template <typename T, size_t N> 
void fun(T (&x)[N]) { ... } 

// const version 
template <typename T, size_t N> 
void fun(const T (&x)[N]) { ... } 

नोट सरणी का आकार भी है कि यहाँ टेम्पलेट पैरामीटर कार्य नहीं करेंगी सब सरणी आकार काम करने के लिए अनुमति देने के लिए T[M] के बाद से: संदर्भ द्वारा एक सरणी गुजर के बराबर प्राप्त करने के लिए, आप निम्न संरचना की जरूरत है और T[N] अलग-अलग M, N के लिए समान प्रकार नहीं हैं। यह भी ध्यान रखें कि फ़ंक्शन शून्य हो जाता है। मान द्वारा सरणी को वापस करने का कोई तरीका नहीं है, क्योंकि सरणी प्रतिलिपि नहीं है, जैसा कि पहले से ही उल्लेख किया गया है।

4

समस्या रिटर्न प्रकार में है: आप एक सरणी वापस नहीं कर सकते क्योंकि सरणी गैर-कॉम्पैक्टिव हैं। और वैसे, आप कुछ भी वापस नहीं कर रहे हैं!

बजाय का प्रयास करें:

template <typename T> 
void fun(T& x) // <--- note the void 
{ 
    cout <<" X is "<<x; 
    cout <<"Type id is "<<typeid(x).name()<<endl; 
} 

और यह अपेक्षा के अनुरूप काम करेंगे।

नोट: मूल पूर्ण त्रुटि संदेश (जीसीसी 4.8 के साथ) वास्तव में है:

test.cpp: In function ‘int main(int, char**)’: 
test.cpp:17:10: error: no matching function for call to ‘fun(int [100])’ 
    fun (a); 
    ^
test.cpp:17:10: note: candidate is: 
test.cpp:7:3: note: template<class T> T fun(T&) 
T fun(T& x) 
^
test.cpp:7:3: note: template argument deduction/substitution failed: 
test.cpp: In substitution of ‘template<class T> T fun(T&) [with T = int [100]]’: 
test.cpp:17:10: required from here 
test.cpp:7:3: error: function returning an array 

सबसे अधिक प्रासंगिक लाइन पिछले एक है।

+0

"प्रभावी आधुनिक सी ++" में आइटम 1 इस तरह से सुझाव देता है। लेखन '(और param) [N] 'अनावश्यक है जब तक आपको' f' के शरीर में 'N' को संदर्भित करने की आवश्यकता न हो (भले ही आपके पास टाइप होने के बाद भी इसे घटाया जा सके) –