2012-03-23 30 views
7

के रूप में टेम्पलेट क्लास ले रहा है, मैं निम्नलिखित कोड से जूझ रहा हूं। असल में, मेरे पास कक्षा फू और नेस्टेड क्लास बार है, और अब मैं क्लास बार ऑब्जेक्ट के पॉइंटर को फ़ंक्शन पर पास करना चाहता हूं, लेकिन यह संकलित नहीं होता है। क्या कोई इसमें मेरी सहायता कर सकता है? धन्यवाद।सी ++ टेम्पलेट फ़ंक्शन पैरामीटर

template <typename T> 
struct Foo 
{ 
    struct Bar 
    { 
     T data_; 
    }; 
    Bar bar_; 
}; 

template <typename T> 
void func(Foo<T>::Bar* bar) // Why is this line wrong??? 
{ 
} 

int main() 
{ 
    Foo<int> foo; 
    foo.bar_.data_ = 17; 
    func(&foo.bar_); 
    return 0; 
} 
+0

के संभावित डुप्लिकेट [सी ++, टेम्पलेट तर्क निष्कर्ष निकाला नहीं जा सकता है] (http://stackoverflow.com/questions/6060824/c-template-argument-can के रूप में -नोट-बी-डिस्प्लेटेड) –

+0

(कम से कम, डुप्लिकेट एक बार स्पष्ट 'टाइपनाम' समस्या को हल करता है, जो वीसी ++ शायद सामान्य रूप से सामान्य रूप से पर्ची छोड़ देगा) –

उत्तर

14

आप निम्न हस्ताक्षर

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Why is this line wrong??? 

हालांकि की आवश्यकता है, कि समस्या सिर्फ

func(&foo.bar_); 
नहीं है

भी होना चाहिए

func<int>(&foo.bar_); 

ऐसा इसलिए है क्योंकि आप टेम्पलेटेड फ़ंक्शन "func" को कॉल कर रहे हैं लेकिन इसका प्रकार घटाया नहीं जा सकता है। अपने प्रकार के बिना, यह एक त्रुटि दे देंगे इस तरह के

no matching function for call to 'func(Foo<int>::Bar*)' 
+2

+1 देखें। सही उत्तर। बड़ी समस्या यह है: 'टी' को कम नहीं किया जा सकता है, इसलिए इसे स्पष्ट रूप से पारित करने की आवश्यकता है। – Nawaz

+2

+1 मुझे "गहरे" उत्तर देने वाले नवागंतुक पसंद हैं! एफवाईआई तथ्य यह है कि 'टी' को यहां नहीं लिया जा सकता है ** ** गैर-deducible संदर्भ ** के रूप में जाना जाता है। –

3

यह एक dependent name है, आप कहते हैं की जरूरत है:

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Tell the compiler explicitly it's a type 
+2

डाउनवॉटर टिप्पणी करने की देखभाल करता है? – Flexo

+0

-1। यह उत्तर अधूरा है, और सवाल में बड़ी समस्या का समाधान नहीं करता है। आपने जो कहा वह सच है, लेकिन 'func (& foo.bar_)' कैसे काम करेगा? यह अभी भी नहीं होगा। – Nawaz

+0

@ नवाज़: कृपया मेरा उत्तर – josephthomas

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