2013-02-02 32 views
9

मैं इस कोड (एक अधिक जटिल संस्करण से सरलीकृत) है: यदि मैं जीसीसी 4.6.3 पर यह संकलन यह संकलित g++ -std=c++0x filename.cpp का उपयोग करvariadic टेम्पलेट कोड जीसीसी 4.6 पर संकलित लेकिन बजना पर नहीं या जीसीसी 4.7

template <class... A1> class Test { 
    public: 
    template <class... A2> void print (void(*function)(A2...,A1...)) { 

    } 
}; 

void test_print (int a, float b, double c) { 

} 

int main() { 
    Test<float,double> test; 
    test.print<int> (&test_print); 
} 

ठीक तथापि बजना 3.0 clang++ -std=c++0x filename.cpp का उपयोग कर इसे निम्न त्रुटि फेंकता पर:

filename.cpp: In function 'int main()': 
filename.cpp:14:33: error: no matching function for call to 'Test<float, double>::print(void (*)(int, float, double))' 
filename.cpp:14:33: note: candidate is: 
filename.cpp:3:33: note: template<class ... A2> void Test::print(void (*)(A2 ..., A1 ...)) [with A2 = {A2 ...}; A1 = {float, double}] 
filename.cpp:3:33: note: template argument deduction/substitution failed: 
filename.cpp:14:33: note: mismatched types 'float' and 'int' 
012:

filename.cpp:14:10: error: no matching member function for call to 'print' 
    test.print<int> (&test_print); 
    ~~~~~^~~~~~~~~~ 
filename.cpp:3:33: note: candidate template ignored: failed template argument deduction 
    template <class... A2> void print (void(*function)(A2...,A1...)) { 
           ^
1 error generated. 

जीसीसी 4.7.2 पर भी कोई त्रुटि है

अब सवाल यह है कि: यह क्यों विफल रहा है या मैं क्या गलत कर रहा हूं?

+0

क्या आपने '' को हटाने का प्रयास किया था? जहां संभव हो सी ++ टेम्पलेट प्रकार कटौती का उपयोग करता है। – leemes

+0

जी ++ 4.7 त्रुटि संदेश: http://ideone.com/qwSKJl तर्क आदेश के साथ एक समस्या प्रतीत होती है। – leemes

+0

@leemes: मैंने कोशिश की और इससे – eyelash

उत्तर

2

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1399 को हल करने के हिस्से के रूप में, यह निर्णय लिया गया था कि एक पैरामीटर पैक जो गैर-कटौतीयोग्य है, कटौती में भाग नहीं लेगा, इसलिए पैरामीटर सूची में स्पष्ट रूप से निर्दिष्ट तर्कों को ध्यान में रखते हुए, लेकिन बाद के कार्यों के बाद के तर्कों के मिलान को परेशान नहीं करना मापदंडों। हालांकि वे जोड़े गए नियमों की तुलना करते समय कटौती के लिए जरूरी नहीं है (जो फंक्शन कॉल के लिए तर्कों के खिलाफ पैरामीटर के सेट की कटौती का उप-एल्गोरिदम है)।

मैं तर्क दूंगा कि संकल्प आपकी स्थिति पर भी लागू होना चाहिए और इसे केवल उस क्षेत्र के रूप में मानना ​​चाहिए जहां विनिर्देश पूरी तरह स्पष्ट नहीं है। आप संबंधित कंपाइलर्स को एक बग रिपोर्ट भेजना चाह सकते हैं और वे इसे स्पष्ट करने के लिए डब्लूजी 21 को एक मुद्दा रिपोर्ट भेजना चाहेंगे (हालांकि मुझे यकीन नहीं है कि मैं कहूंगा कि यह एक मानक नमूना मुद्दा है - मानक कहता है कि कहीं भी गैर-कटौती करने वाले संदर्भ कटौती में भाग नहीं लेते हैं)।

के रूप में नोट A1 संलग्नित क्लास टेम्पलेट की एक पैरामीटर (और इसलिए सामान्य मापदंडों हो जाते हैं जब वर्ग instantiated है) है, तो आप उन्हें छोड़ देते हैं और एक ही अर्थ जहाँ तक टेम्पलेट argment कटौती का सवाल है रख सकते

class Test { 
    public: 
    template <class... A2> void print (A2..., float, double) { 

    } 
}; 

int main() { 
    Test test; 
    test.print<int> (1, 1.0f, 1.0); // works 
} 
+0

आपने अपने उदाहरण में फ़ंक्शन पॉइंटर हटा दिया है। अगर मैं इसे हटा नहीं पाता हूं तो यह अभी भी विफल रहता है: http://ideone.com/I3KY8d – eyelash

+0

@eyelash जो मैं अपने उत्तर में कहता हूं। –

+0

@ JohannesSchaub-litb क्या 'गैर-deducibility' इस तथ्य से उपजी है कि एक दूसरे के पास दो पैरामीटर पैक (पीपी) हैं, एक पीपी समारोह का अंतिम पैरामीटर नहीं है, या नियमों का कोई अन्य सामान्य सेट नहीं है? –