2011-06-09 6 views
5

मैं संकलन निम्न कोड के साथ समय समस्या हो रही है:सी ++ टेम्पलेट आंशिक विशेषज्ञता सवाल

template <typename T, 
      template <class T, class Allocator = std::allocator<T> > class C> 
    bool is_in(const C<T>& a, const C<T>& b); 

    template <typename T, std::vector> // HERE 
    bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
    { 
    return false; // implementation tbd 
    } 

... 

vector<int> a, b; 

cout << is_in(a,b) << endl; 

त्रुटि संदेश है (लाइन पर "यहाँ" चिह्नित):

error: 'std::vector' is not a type 

(की पाठ्यक्रम, मैं में std से वेक्टर शामिल है!)। कोई उपाय? मैंने थोड़ी देर के लिए इसके साथ झुकाया, लेकिन मैं उस बिंदु पर जा रहा हूं जहां मैं कुछ मदद का उपयोग कर सकता हूं :-) मुझे आंशिक रूप से प्रारंभिक टेम्पलेट घोषणा का विशेषज्ञ होना चाहिए ताकि मैं वास्तविक प्रकार के आधार पर कंपाइलर स्विच कार्यान्वयन कर सकूं कंटेनर सी (सेट के लिए is_in होगा, एक वैक्टर के लिए, एक श्रेणी के लिए ..., प्रत्येक बार अलग-अलग एल्गोरिदम के साथ)।

धन्यवाद!

उत्तर

6

मानक द्वारा फ़ंक्शन टेम्पलेट का आंशिक विशेषज्ञता अनुमति नहीं है।

एक साधारण समाधान है: अधिभार का उपयोग करें।

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
{ 
    return false; // implementation tbd 
} 

यह ओवरलोडेड फ़ंक्शन टेम्पलेट है। इसकी आंशिक विशेषज्ञता नहीं है।

या, आप ऐसा कर सकता है:

namespace detail 
{ 
    template<typename T, typename C> 
    struct S 
    { 
     static bool impl(const C & a, const C & b) 
     { 
      //primary template 
      //... 
     } 
    } 
    template<typename T> 
    struct S<T, std::vector<T> > 
    { 
     static bool impl(const std::vector<T> & a, const std::vector<T> & b) 
     { 
      //partial specialization for std::vector 
      return false; 
     } 
    } 
} 

template <typename T, template <class T, class Allocator = std::allocator<T> > class C> 
bool is_in(const C<T>& a, const C<T>& b) 
{ 
    return detail::S<T, C<T> >::impl(a,b); 
} 
+1

का संभावित हल एक कक्षा में समारोह जगह है। –

+0

Booouuuhhh! :-) बेशक, यह मेरे प्रयासों को कम करेगा - मुझे एक फ़ंक्शन ऑब्जेक्ट रोल करना होगा ... – Frank

0

मैं अगर यह काम करता है (टेम्पलेट टेम्पलेट्स हमेशा मेरे दिमाग के लिए एक मुसीबत कर रहे हैं के रूप में) पता नहीं है, लेकिन क्या बारे में सिर्फ कोशिश कर

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
{ 
    ... 
} 

क्योंकि यह एक विशेषज्ञता है।

संपादित करें: अन्य ने पहले से ही इस पर स्पष्ट किया है, लेकिन मैं इसे पूर्णता के लिए जोड़ दूंगा। उपरोक्त कोड वास्तव में एक अधिभार है और आंशिक विशेषज्ञता नहीं है, लेकिन आंशिक कार्य विशेषज्ञता को वैसे भी अनुमति नहीं है।

+1

यह कोई विशेषज्ञता नहीं है। इसका अधिभारित फ़ंक्शन टेम्पलेट। – Nawaz

+0

@ नवाज ओह हाँ, आप सही हैं। ल्यूक का जवाब वाक्यविन्यास मतभेदों पर स्पष्ट करता है, लेकिन आंशिक विशेषज्ञता को वैसे भी अनुमति नहीं है, जैसा कि आप अपने उत्तर में भी कहते हैं। –

1

फ़ंक्शन टेम्पलेट आंशिक विशेषज्ञता की अनुमति नहीं है। किसी भी मामले में आप टेम्पलेट विशेषज्ञता सिंटैक्स का उपयोग नहीं कर रहे हैं, आप वास्तव में एक अतिरिक्त अधिभार लिख रहे हैं। ऐसा करें:

तो
template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b) 
{ 
    return false; // implementation tbd 
} 

आंशिक विशेषज्ञता की अनुमति दी गई, यह इस बजाय दिखाई देगा:

template <typename T> // std::vector is not a template parameter, 
         // so we wouldn't put it here 
bool is_in<T, std::vector>(const std::vector<T>& a, const std::vector<T>& b) 
// instead, it'd appear^here, when we're specializing the base template 
{ 
    return false; // implementation tbd 
} 
+1

जिसके परिणामस्वरूप: त्रुटि: फ़ंक्शन टेम्पलेट आंशिक विशेषज्ञता 'is_in <टी, टेम्पलेट <वर्ग _Tp, कक्षा _Alloc> वर्ग std :: vector>' को स्पष्ट रूप से अनुमति नहीं है। – Frank

+0

@ फ्रैंक न सिर्फ कोड कॉपी और पेस्ट करें। हालांकि मैंने पोस्ट में जोर दिया है। –

+0

मैंने कॉपी और पेस्ट नहीं किया था। मैंने पहले खुद कोशिश की थी। – Frank