2013-03-18 9 views
5

के भीतर से मैं एक हेडर फाइल के भीतर निम्न विधि बुला लिया गया गया है कॉल नहीं कर सकते 'filter.h':सी ++ विधि (टेम्पलेट के साथ) टेम्प्लेटेड विधि

namespace std{ 

//some code 

template <class T, class S, class BorderMethod> 
tImage<T> binomial(const tImage<T> &in, const size_t k = 3) { 
    //do some computations 

    tImage<T> img = in.convolve<T, BorderMethod>(in, kernel); 
    return img; 
} 
} 

पहली बात मैंने देखा है: की परिभाषा यह विधि हेडर-फ़ाइल के भीतर होती है। क्या वह मानक प्रक्रिया है?

अब, वास्तविक समस्या: विधि convolve पर कॉल काम नहीं करेगा, भले ही in में ऐसी विधि हो।

tImage<T> convolve(const gravis::tImage<T>& image, const gravis::tArray<typename tImageTraits<T>::Float_t>& kernel); 

मैं इस कार्य को करने के लिए क्या है: यहाँ विधि convolve की परिभाषा वर्ग tImage<T> भीतर है?

+0

'in'' const' तर्क है, इसलिए गैर-'const' सदस्य फ़ंक्शन पर इसका आह्वान नहीं किया जा सकता है। – hmjd

+0

'द्विपदीय' लगता है कि 'convolve' एक फ़ंक्शन टेम्पलेट है, लेकिन' convolve' फ़ंक्शन टेम्पलेट (केवल टेम्पलेट क्लास का सदस्य फ़ंक्शन) जैसा नहीं दिखता है। – aschepler

+0

आपका नाम 'नेमस्पेस std' में क्यों है? 'Std' नेमस्पेस (विशेषज्ञता के अलावा) में जोड़ना अवैध है। – Praetorian

उत्तर

6

पहली बात मैंने देखा है: इस विधि की परिभाषा हेडर-फ़ाइल के भीतर होती है। क्या वह मानक प्रक्रिया है?

हां। आम तौर पर फ़ंक्शन टेम्पलेट की परिभाषा शीर्षकों में रखी जाती है। अगर उन्हें .cpp फ़ाइल में अलग किया गया था, तो संकलक उन्हें लागू होने पर तत्काल तत्काल नहीं कर पाएगा, और जब तक आप उचित कार्रवाई नहीं करेंगे, तो परिणामस्वरूप लिंकर अपरिभाषित संदर्भों के बारे में शिकायत करेगा। अधिक जानकारी के लिए this Q&A on StackOverflow देखें।

विधि संकल्प के लिए कॉल काम नहीं करेगा, भले ही इसमें ऐसी विधि हो।

convolve() गैर const सदस्य समारोह है, और आप const के लिए एक संदर्भ के माध्यम से यह आह्वान करने के लिए कोशिश कर रहे हैं। यह अवैध है और संकलक आपको बता रहा है।


इसके अलावा, के रूप में सही ढंग से अपने जवाब में JBentley से कहा, आप नए घोषणाओं या परिभाषाओं std नाम स्थान को नहीं जोड़ सकते। प्रति पैरा सी ++ 11 स्टैंडर्ड की 17.6.4.2.1/1:

एक सी अगर यह नाम स्थान एसटीडी जब तक अन्यथा भीतर घोषणाओं या परिभाषाओं एसटीडी नाम स्थान के लिए या एक नाम स्थान में जोड़ता है ++ कार्यक्रम अपरिभाषित है व्यवहार निर्दिष्ट। [...]

+0

धन्यवाद! मैंने इस विशिष्ट प्रश्न के लिए किसी अन्य नाम की कमी के कारण नामस्थान 'std' कहा ... लेकिन फिर भी, मुझे इस तथ्य से अवगत नहीं था कि मैं अपना नामस्थान' std' नाम नहीं दे सकता, इसलिए वैसे भी धन्यवाद । – kaufmanu

2

हालांकि आपकी समस्या का कारण नहीं है, आपके कोड ने व्यवहार को अपरिभाषित किया है क्योंकि आपने इसे अवैध रूप से std नामस्थान के अंदर रखा है।

this question या this one देखें।

+0

+1, मैंने यह नहीं देखा था। मेरे जवाब में भी इसका जिक्र करेंगे –

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