सी ++ 03 में, कुछ संदर्भों में टेम्पलेट पैरामीटर कटौती नहीं होती है। उदाहरण के लिए:टेम्पलेट उपनाम टेम्पलेट पैरामीटर कटौती को कैसे प्रभावित करते हैं?
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
void f(typename A<T>::type);
int main()
{
B<int> b;
f(b); // ERROR: no match
}
यहाँ, int
, T
के लिए निष्कर्ष निकाला नहीं है, क्योंकि इस तरह के A<T>::type
के रूप में एक नेस्टेड प्रकार एक गैर निष्कर्ष निकाला संदर्भ है।
मैं इस तरह समारोह लिखा था:
template <typename T> struct B {};
template <typename T>
void f(B<T>);
int main()
{
B<int> b;
f(b);
}
सब कुछ ठीक है क्योंकि B<T>
एक निष्कर्ष निकाला संदर्भ है।
सी ++ 11 में, हालांकि, टेम्पलेट उपनाम का उपयोग दूसरे उदाहरण के समान वाक्यविन्यास में नेस्टेड प्रकार को छिपाने के लिए किया जा सकता है। उदाहरण के लिए:
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
using C = typename A<T>::type;
template <typename T>
void f(C<T>);
int main()
{
B<int> b;
f(b);
}
इस मामले में टेम्पलेट तर्क कटौती कार्य करेगा? दूसरे शब्दों में, क्या टेम्पलेट उपरोक्त एक संदर्भित संदर्भ या गैर-कटौती संदर्भ हैं? या क्या वे जो भी उपनाम की कटौती/गैर-कटौती की स्थिति का उत्तराधिकारी हैं?
उपनाम केवल उपनाम हैं। यह 'टेम्पलेट शून्य एफ (टाइपनाम ए :: प्रकार) लिखने जैसा है;', जो deducible नहीं है। –
[सी ++, टेम्पलेट तर्क का संभावित डुप्लिकेट घटाया नहीं जा सकता] [http://stackoverflow.com/questions/6060824/c-template-argument-can-not-be-deduced) – Nawaz
मुझे लगता है कि केरेक एसबी सही है इसके बारे में। अगर उद्धरण प्रदान किया गया था तो मुझे जाने और एक खोज करने की आवश्यकता नहीं होगी ;-) –