template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
आपको std::size_tइसके बजाय उपयोग करना चाहिए int।
यहाँ भागो
संपादित करें:
वास्तव में, आपकी टिप्पणियों और कोड के बारे में मेरे अंतर्ज्ञान ने मुझे विषय में खुदाई करने के लिए प्रेरित किया। पहली नज़र में, एक मानक डेवलपर (मेरे जैसे) उम्मीद परिवर्तित करने के लिए संकलक intकरने के लिए std::size_t(क्योंकि वे दोनों अभिन्न प्रकार के होते हैं और परोक्ष परिवर्तित बहुत मामूली बात है) स्पर्श करें और void foo(std::vector<std::array<T1, SIZE>> bar)सबसे अच्छा विशेषज्ञता के रूप में। तो टेम्पलेट तर्क कटौती पृष्ठ पढ़ते समय मुझे यह मिला:
यदि पैरामीटर सूची में एक गैर-प्रकार टेम्पलेट पैरामीटर का उपयोग किया जाता है, और संबंधित टेम्पलेट तर्क को घटाया जाता है, तो घटा हुआ टेम्पलेट तर्क का प्रकार (जैसा कि इसकी एन्कोडिंग टेम्पलेट पैरामीटर सूची में निर्दिष्ट किया गया है, जिसका अर्थ है कि संदर्भ संरक्षित हैं) का प्रकार से मेल खाना चाहिए गैर-टाइप टेम्पलेट पैरामीटर बिल्कुल, सिवाय इसके कि सीवी-क्वालीफायर को छोड़ दिया जाता है, और जहां टेम्पलेट तर्क को एक सरणी बाउंड से घटाया जाता है - उस मामले में किसी भी अभिन्न प्रकार की अनुमति है, भले ही यह हमेशा सच हो जाए:
हमेशा की तरह, निश्चित रूप से, आपको यह समझने के लिए एक बार से कुछ अधिक बार पढ़ना चाहिए कि इसका क्या मतलब है :)
तो एक दिलचस्प परिणाम सामने आता है।
पहले से ही हमारी वांछित विशेषज्ञता का चयन नहीं किया गया है, लेकिन यदि कंपाइलर को चुनने के लिए मजबूर किया गया था, तो यह एक त्रुटि होगी।
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo(b); // P = std::vector<std::array<int,(int)SIZE>
// A = std::vector<std::array<int,(unsigned_long)SIZE>>
// error: deduced non-type template argument does not have the same
// type as its corresponding template argument */
}
कोड चलाएं
एक और दिलचस्प बात है:
यदि गैर-प्रकार के टेम्पलेट तर्क को घटाया नहीं गया था, तो कोई प्रतिबंध नहीं होगा जो तर्क और टेम्पलेट प्रकारों को समान करने के लिए बाध्य करता है।
#include <vector>
#include <array>
#include <iostream>
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo<int,3>(b);
}
कोड चलाएं
vectorउन सभी पर बाहरी को हटाकर । यहां देखें