के साथ टेम्पलेट टेम्पलेट पैरामीटर और वैरिएड टेम्पलेट्स मैं डेबियन निचोड़ पर जीसीसी 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 द्वारा टिप्पणियों में सुझाए गए कामकाज ने मेरे लिए काम किया, जो बताता है कि यह वही बग है। बेशक, मैं अब (ए) सोच रहा हूं कि यह कामकाज कितना नाजुक है और (बी) यह क्यों काम करता है, और इस बारे में सोचने के लिए आईएस को प्रेरित किया गया। हालांकि मुझे लगता है कि केवल आईएसई आखिरी बिट का जवाब दे सकता है। :-)
कोड g ++ 4.7 पर संकलित करता है। एक बग होना चाहिए। – kennytm
@ केनीटीएम: धन्यवाद। इसका मतलब है कि मुझे इसकी रिपोर्ट करने की आवश्यकता नहीं है, है ना? –
दाएं। ~~~~~~~~~~ – kennytm