2015-01-14 8 views
10

से भिन्न वैरिएड टेम्पलेट से विरासत में मेरे पास कुछ कोड है जो जीसीसी के तहत काम करता है लेकिन विजुअल स्टूडियो 2015 के तहत संकलित करने में विफल रहता है (जिसे मैं महसूस करता हूं कि विकास में है लेकिन यह क्षेत्र I लगता है है लागू किया जाना चाहिए)।क्या यह कंपाइलर है या सिर्फ मुझे: लैम्ब्स

template< typename... T > 
class inherit : public T... 
{ 
public: 
inherit(T... t) : T(t)... {} 
}; 

int main() { 
    auto l1 = []() {}; 
    auto l2 = []() {}; 
    inherit<decltype(l1), decltype(l2)> test(l1, l2); 
    return 0; 
} 

कोड है कि यह का शुद्ध सार करने के लिए कम स्निपेट। विजुअल स्टूडियो का कहना है "विरासत त्रुटि: 'प्रकार' 'उत्तराधिकारी के निर्माता पर। इसके बाद यह एक छोटा सा निशान बताता है कि यह वहां कैसे पहुंचा और "आप लैम्ब्डा का उदाहरण नहीं बना सकते" के साथ निष्कर्ष निकाला।

मेरी धारणा यह है कि टी (टी) का विस्तार सही ढंग से विस्तार नहीं कर रहा है। हालांकि मुझे सिंटैक्स गलत हो रहा है।

संपादित करें: क्षमा करें सवाल यह है: क्या मैं यहां गलती हूं या नहीं? यदि हां, तो सही वाक्यविन्यास क्या है?

अतिरिक्त खोज: मेरे द्वारा किए गए उत्तरों को ध्यान में रखते हुए, यह दृश्य क्षेत्र 2015 के साथ इस क्षेत्र में एक बग रखने वाला एक मुद्दा प्रतीत होता है। परीक्षण में ऐसा लगता है कि यह विस्तार जहां कन्स्ट्रक्टर पैरा को लैम्ब्डा बेस क्लास में पास किया जाता है, जिसमें समस्या है। निम्नलिखित परीक्षण VS2015:

template< typename T1, typename T2, typename... T3 > 
class inherit2 : public T3... 
{ 
public: 
    inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {} 
}; 

int main() { 
    auto l1 = []() {}; 
    auto l2 = []() {}; 
    inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2); 
    return 0; 
} 
+2

ठीक लग रहा है, clang ++ इसे स्वीकार करता है। क्या होता है जब आप भिन्नता को हटाते हैं, लेकिन भेड़ के बच्चे को छोड़ देते हैं? – dyp

+0

मुझे लगता है कि जब आप कुछ मामलों में लैम्ब्डा पास करते हैं तो विजुअल स्टूडियो में कोई समस्या होती है https://connect.microsoft.com/VisualStudio/feedback/details/727957/vc11-beta-compiler-fails-to-compile-lambda-key- तुलनात्मक-के-मानचित्र-और-सेट http://stackoverflow.com/questions/25777396/passing-my-compar-function-to-stdmultiset-with-c11/25777512#comment43645224_25777512 – AndyG

+3

आपका कोड gcc 4.6 के बाद से समर्थित है और clang 3.1 (2012 की शुरुआत से दोनों)। दृश्य सी ++ यहां 3 साल पीछे चल रहा है। विफलता के लिए – TemplateRex

उत्तर

0

यह संकलक है। जुलाई 2015 से more recent MSVC, v। 19.00.23106.0, आपके उदाहरण को स्वीकार करता है।

शायद प्रारंभिक वाक्यविन्यास T{t}... ब्रेस मदद मिलेगी। हालांकि, कोशिश करने के लिए मुझे एक उपयुक्त ऑनलाइन कंपाइलर नहीं मिल रहा है।

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