2011-12-29 20 views
5

मैं टेम्पलेट ऑपरेटर के लिए विशेषज्ञता करने के लिए कोशिश कर रहा हूँ, टेम्पलेट इस तरह दिखता है:ऑपरेटर() टेम्पलेट विशेषज्ञता

template <typename Iterator1, typename Iterator2> 
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const 

बाद मैं विशेषज्ञता है कि इस तरह दिखता है क्या किया:

template <> 
float operator()<float*,float*>(float* a, float const* b, unsigned long size, float worst_dist = -1) const 

मैं संकलन के दौरान त्रुटि प्राप्त करें:

वर्ग स्कोप

के भीतर फ़ंक्शन 'ऑपरेटर()' का विशेषज्ञ नहीं हो सकता

उन सभी समारोह struct टेम्पलेट

में हैं मैं कुछ मदद मिल करने में खुशी होगी। धन्यवाद।

+0

जब आप "विनिर्देश" कहते हैं, तो क्या आपका मतलब है, "विशेषज्ञता"? –

+0

मुझे लगता है कि [यह SO प्रश्न/उत्तर] [1] आप जो करने की कोशिश कर रहे हैं उसका उत्तर दे सकते हैं। [1]: http://stackoverflow.com/questions/4920068/partially-specializing-member-function-implementations – wilx

+0

क्या 'ResultType' है? क्या यह आपके टेम्पलेट पैरामीटर में से एक होना चाहिए? –

उत्तर

7

आप इस ऑपरेटर को वैसे भी विशेषज्ञ क्यों बनाना चाहते हैं? आप सिंटैक्स का उपयोग करके इसे कॉल करने में सक्षम नहीं होंगे जो विशेषज्ञताओं पर निर्भर करता है (यानी स्पष्ट रूप से [कुछ] टेम्पलेट तर्क प्रदान करते हैं) वैसे भी! बस ओवरलोडिंग का उपयोग करें और आपको ठीक होना चाहिए। यद्यपि यह कभी-कभी वांछनीय या यहां तक ​​कि जरूरी है कि आप स्पष्ट रूप से टेम्पलेट तर्क निर्दिष्ट करते हैं, यह सामान्य रूप से ओवरलोडिंग के बजाय विशेषज्ञता का उपयोग करने के लिए महत्वपूर्ण नहीं है।

मैं बस मानक में चीजों को पढ़ता हूं और वास्तव में एक स्पष्ट विशेषज्ञता प्रदान करना संभव है, हालांकि इसे कक्षा परिभाषा के बाहर होना चाहिए। उदाहरण के लिए:

#include <iostream> 

struct foo 
{ 
    template <typename T> void operator()(T const&) { 
     std::cout << "general\n"; 
    } 
}; 

template <> 
void foo::operator()<int>(int const&) { 
    std::cout << "int spec\n"; 
} 

int main() 
{ 
    foo f; 
    f(1.2); 
    f(1); 
    f<double>(1); // <-- ERROR: doesn't work! 
} 

यह अधिभार का उपयोग करके भी काम करता। स्पष्ट रूप से निर्दिष्ट टेम्पलेट तर्कों का उपयोग करना अभी भी काम नहीं करता है।

+1

+1 विशेषज्ञता पर फ़ंक्शन ओवरलोडिंग के लिए। – AJG85

+0

मैं देखता हूं, उत्तर के लिए धन्यवाद –

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