यह प्रश्न उन कार्यों के बारे में है जो स्थिर रूप से ज्ञात आकार के सरणी लेते हैं।टेम्पलेट पैरामीटर कटौती में int [5] और int (& a) [5] के बीच अंतर
उदाहरण के लिए निम्नलिखित न्यूनतम कार्यक्रम लें:
#include <iostream>
template<size_t N>
void arrfun_a(int a[N])
{
for(size_t i = 0; i < N; ++i)
std::cout << a[i]++ << " ";
}
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
arrfun_a<5>(a);
std::cout << std::endl;
arrfun_a<5>(a);
return 0;
}
कौन सा है, जब चलाने के लिए, अपेक्षित परिणाम प्रिंट:
2 3 4 5 6
3 4 5 6 7
हालांकि, जब मैं अपने संकलक (वी.एस. 2010) करने की कोशिश की अनुमान 5
, यह could not deduce template argument for 'int [n]' from 'int [5]'
है।
अनुसंधान के एक बिट अद्यतन arrfun_b
में हुई जहां टेम्पलेट पैरामीटर कटौती काम करता है:
template<size_t n>
void arrfun_b(int (&a)[n])
{
for(size_t i = 0; i < n; ++i)
std::cout << ++(a[i]) << std::endl;
}
कार्यक्रम का परिणाम एक ही है, arrfun_a
या arrfun_b
कहा जाता है या नहीं।
अब तक, फर्क सिर्फ इतना है कि मैं पाया है टेम्पलेट तर्क कटौती से काम करता है कि क्या है और अगर यह संभव है एक एन कि 5 नहीं है के साथ समारोह ...
क्या आप वाकई सुनिश्चित हैं कि 'दोनों संस्करण स्पष्ट रूप से एन को पारित करने की अनुमति देते हैं जो छोटा या बड़ा है'? यह मेरे लिए नहीं [और नहीं] (http://ideone.com/74FaV) होना चाहिए। और यह संदर्भ संस्करण का उपयोग करने के लिए एक और _pro_ है – Lol4t0
मेरे भ्रम को ठीक करने के लिए धन्यवाद! परीक्षण के दौरान किसी जगह पर, मुझे उस के साथ खराब होना चाहिए! –
आपने गैर-संदर्भ संस्करण को नहीं हटाया और एक अधिभार बनाया, जिसे कहा जाता था। – Lol4t0