2011-12-15 11 views
9

के साथ टेम्पलेट टेम्पलेट पैरामीटर और वैरिएड टेम्पलेट्स मैं डेबियन निचोड़ पर जीसीसी 4.4 का उपयोग कर रहा हूं। निम्नलिखित कोड पर विचार करें।जीसीसी 4.4

#include <map> 
#include <string> 
using std::map; 
using std::string; 

// Args lets the user specify additional explicit template arguments 
template <typename T, 
     template <typename T, typename... Args> class C, 
     typename... Args> 
C<T, Args...> foo() 
{ 
    C<T, Args...> x; 
    return x; 
} 

int main(void) 
{ 
    map<string, int> a = foo<string, map, int>(); 
} 

तो, विचार यहाँ है कि T मैचों string, C मैचों map, और टेम्पलेट पैरामीटर पैक Args मैचों int। मेरे पास कुछ वाक्यविन्यास गलत हो सकता है, अगर ऐसा है तो कृपया सही करें। विशेष रूप से, यदि T से मेल खाने के लिए class C में पहला टेम्पलेट तर्क चाहता है और बाकी टेम्पलेट पैरामीटर पैक Args से मेल खाते हैं, तो template <typename T, typename... Args> class C सही वाक्यविन्यास है?

यह त्रुटि

In function 'int main()': 
post.cc:18: error: no matching function for call to 'foo()' 

देता है यह सवाल Variadic template templates and perfect forwarding के समान प्रतीत होता है। वह सवाल बताता है कि यह एक जीसीसी बग है, लेकिन हो सकता है कि मुझे यह सोचने में गलती हो कि ये प्रश्न एक ही चीज़ के बारे में हैं।

कृपया नम्र रहें। विविध टेम्पलेट्स का मेरा ज्ञान 12 घंटे से कम पुराना है; मैं सिर्फ नकल को कम करने के लिए कुछ पुराने सी ++ कोड को फिर से लिखने की कोशिश कर रहा था। यह कुछ समय हो गया है क्योंकि मैंने कोई सी ++ किया था। यदि कोई कामकाज है, तो कृपया मुझे बताएं। धन्यवाद।

संपादित करें: Variadic template templates and perfect forwardingIse Wisteria द्वारा टिप्पणियों में सुझाए गए कामकाज ने मेरे लिए काम किया, जो बताता है कि यह वही बग है। बेशक, मैं अब (ए) सोच रहा हूं कि यह कामकाज कितना नाजुक है और (बी) यह क्यों काम करता है, और इस बारे में सोचने के लिए आईएस को प्रेरित किया गया। हालांकि मुझे लगता है कि केवल आईएसई आखिरी बिट का जवाब दे सकता है। :-)

+0

कोड g ++ 4.7 पर संकलित करता है। एक बग होना चाहिए। – kennytm

+0

@ केनीटीएम: धन्यवाद। इसका मतलब है कि मुझे इसकी रिपोर्ट करने की आवश्यकता नहीं है, है ना? –

+0

दाएं। ~~~~~~~~~~ – kennytm

उत्तर

3

के रूप में संपादन में चर्चा की, मेरे सवाल जुड़ा हुआ सवाल है, Variadic template templates and perfect forwarding रूप में एक ही बग गुदगुदी करने के लिए प्रकट होता है। विशेष रूप से, एक लिंक में दिए गए कामकाज भी मेरे मामले में काम करता है। संशोधित कोड जो काम करता है निम्नानुसार है:

#include <map> 
#include <string> 
using std::map; 
using std::string; 

template <typename T, 
     template <typename T, typename... Args> class C, 
     typename... Args> 
struct X 
{ 
    typedef C<T, Args...> type; 
}; 

template <typename T, 
     template <typename T, typename... Args> class C, 
     typename... Args> 
typename X<T, C, Args...>::type foo() 
{ 
    C<T, Args...> x; 
    return x; 
} 

int main(void) 
{ 
    map<string, int> a = foo<string, map, int>(); 
} 
0

मुझे नहीं लगता कि वैरिएड टेम्पलेट पैरामीटर g ++ 4.4 में गैर-चरणीय तर्कों से मेल खा सकते हैं, इसलिए आपको अपने फू फ़ंक्शन को गैर-वैरिएडिक संस्करण के साथ अधिभारित करने की आवश्यकता है।

यह भी ध्यान रखें कि मानचित्र में वास्तव में दो से अधिक टेम्पलेट पैरामीटर हैं, और इसके लिए नए foo-function से मेल नहीं खाते हैं।

अपने उदाहरण के लिए यह इसके अलावा यह स्पष्ट करना चाहिए:

#include <map> 
#include <string> 
using std::map; 
using std::string; 

// Args lets the user specify additional explicit template arguments 
template <typename T, 
      template <typename T, typename... Args> class C, 
      typename... Args> 
C<T, Args...> foo() { 
    C<T, Args...> x; 
    return x; 
} 

template<typename T, template<typename, typename> class C, typename Arg> 
C<T, Arg> foo() { 
    return C<T, Arg>(); 
} 

template<typename T, typename... Args> class A {}; 

template<typename T, typename Arg> class B {}; 

int main(void) { 
    map<string, int> a = foo<string, map, int>(); // fails. 
    A<string, int> x = foo<string, A, int>(); 
    B<string, int> y = foo<string, B, int>(); 
} 
+0

नहीं, विविधता टेम्पलेट स्पष्ट रूप से nonvariadic टेम्पलेट से मिलान करने में सक्षम हैं। – Xeo

+0

@Xeo: g ++ 4.4 – masaers

+0

पर नहीं, ठीक है, यह एक बग है। मैं मानक कहता हूं कि मैं क्या कह रहा हूं।"मुझे नहीं लगता कि विविध टेम्पलेट पैरामीटर गैर-वैरिएडिक तर्कों से मेल खा सकते हैं" ऐसा लगता है कि आपको लगता है कि यह सामान्य रूप से मामला है। – Xeo