2010-04-19 15 views
7

मैं निम्नलिखित कोड है: जब मैं कोड जीसीसी 4.3.3 के साथ मैं एक संदेश (aaa.cc:17: error: no matching function for call to ‘tf(pointer<float>&)’) प्राप्त संकलन का संकेतऑपरेटर रूपांतरणों को निहित कार्यों के लिए निहित रूप से क्यों नहीं बुलाया जाता है? (C++)

template <class T> 
struct pointer 
{ 
    operator pointer<const T>() const; 
}; 


void f(pointer<const float>); 

template <typename U> 
void tf(pointer<const U>); 

void g() 
{ 
    pointer<float> ptr; 
    f(ptr); 
    tf(ptr); 
} 

कि संकलक गैर टेम्प्लेटेड समारोह च के लिए 'operator pointer<const T>' कहा जाता है() , लेकिन templated समारोह टीएफ() के लिए नहीं था। एक कॉन्स्ट और गैर-कॉन्स संस्करण के साथ टीएफ() को अधिभारित करने के लिए कोई कामकाज छोटा क्यों है?

किसी भी मदद के लिए अग्रिम धन्यवाद।

+0

शायद स्टैक ओवरफ्लो सॉफ़्टवेयर आपके टेम्पलेट कोण ब्रैकेट को हटा रहा है? – jonner

उत्तर

6

, यह है कि बात करने के लिए कभी नहीं हो जाता है।

पर विचार करें:

template <typename T> 
struct foo {}; 

template <typename U> 
void bar(foo<U>) 
{} 

foo<int> f; 
bar(f); 

कि कॉल बार के लिए, संकलक मान सकते हैं कि U एक int है, और समारोह का दृष्टांत। हालांकि, पर विचार करें:

template <typename U> 
void bar(foo<const U>) 
{} // note ^^^^ 

foo<int> f; 
bar(f); 

कोई U संकलक ऐसी है कि foo के प्रकार के पैरामीटर के प्रकार से मेल खाता है यह मान सकते हैं है। Ergo, टेम्पलेट त्वरण विफल रहता है। रूपांतरण होने का कोई मौका नहीं है।

+0

धन्यवाद। यही वही है जो मुझे जानने की जरूरत है। –

1
template <typename U> 
void tf(pointer<const float>); 

^संकलक जब तक आप स्पष्ट समारोह कॉल में एक पैरामीटर के प्रकार का उल्लेख इस समारोह के लिए एक समारोह कॉल से मेल नहीं खाएगी, जब से तुम एक समारोह तर्क के रूप में typename U प्रयोग नहीं करते। मुझे लगता है कि आप की तरह कुछ करना चाहता हूँ: कारण यह है कि आप टेम्पलेट कटौती के दौरान निहित प्रकार रूपांतरण नहीं मिलता है

template <typename U> 
void tf(pointer<U>); 
संबंधित मुद्दे