2012-09-24 16 views
19

कोड के निम्न भाग में क्या गलत है?अभ्यर्थी टेम्पलेट को अनदेखा किया गया क्योंकि टेम्पलेट तर्क अनुमानित नहीं किया जा सका

17:2: error: no matching function for call to 'foo' 
     foo(x, y);  
     ^~~ 
10:6: note: candidate template ignored: couldn't infer template argument 'K' 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    ^
1 error generated. 

उत्तर

37

तर्क Kconst typename A<K>::X में निगम्य नहीं है:

#include <iostream> 

template<typename K> 
struct A { 
    struct X { K p; }; 
    struct Y { K q; }; 
}; 

template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

int main() { 
    A<float>::X x; 
    A<float>::Y y; 
    foo(x, y); 
} 

बजना निम्न त्रुटि संदेश देता है। असल में, :: के बाकी सब कुछ deducible नहीं है (यदि :: नेस्टेड-नाम को अलग करता है)।

यह देखने के लिए क्यों यह कोई मतलब नहीं है यह सोचा प्रयोग के माध्यम से चलाकर कटौती के लिए पूछने के लिए तुच्छ है: (जैसे कि किसी भी प्रकार को देखते हुए:

struct A { typedef int type; } 
struct B { typedef int type; } 

template <typename T> void foo(typename T::type); 

foo(5); // is T == A or T == B ?? 

नेस्टेड प्रकार के प्रकार से कोई एक-से-एक मानचित्रण है int के रूप में), ऐसे कई परिवेश प्रकार हो सकते हैं जिनमें से यह घोंसला वाला प्रकार है, या वहां कोई भी आवश्यकता नहीं है।

6
template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

K, निष्कर्ष निकाला नहीं किया गया सकता है क्योंकि यह non-deduced संदर्भ में है।

n3337 14.8.2.5/4

कुछ संदर्भों में, हालांकि, मान प्रकार कटौती में भाग नहीं लेता, लेकिन इसके बजाय टेम्पलेट तर्क के मूल्यों कि या तो कहीं और निष्कर्ष निकाला या स्पष्ट रूप से निर्दिष्ट किया गया उपयोग करता है। यदि कोई टेम्पलेट पैरामीटर केवल गैर-कटौती संदर्भों में उपयोग किया जाता है और स्पष्ट रूप से निर्दिष्ट नहीं किया गया है, तो टेम्पलेट तर्क कटौती विफल हो जाती है।

n3337 14.8.2.5/5

गैर निष्कर्ष निकाला संदर्भों हैं:

- एक प्रकार है कि एक योग्य-आईडी का उपयोग कर निर्दिष्ट किया गया था की नेस्टेड-नाम-विनिर्देशक।

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

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