2016-06-21 3 views
7

विजुअल स्टूडियो 2015 अपडेट 3 सी ++ 11 का बेहतर समर्थन, लेकिन मुझे अजीब समस्या है और मैं वर्कअराउंड की तलाश में हूं।MSVC2015 अद्यतन 3 वैरिएडिक टेम्पलेट वर्कअराउंड

टेम्पलेट प्रकार तर्क ("पूरी तरह परिभाषित प्रकार") के लिए एमएसवीसी के साथ विविधता-टेम्पलेट कोड को संकलित करते समय सभी अच्छे काम करते हैं, लेकिन यदि मैं टेम्पलेट टेम्पलेट तर्क ("आंशिक रूप से परिभाषित प्रकार") का उपयोग करना चाहता हूं, तो परिणाम गलत हो जाता है।

#include <iostream> 
using namespace std; 

template <template<typename> class... TS> 
struct PARTIAL { 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-PROBLEM" << endl; 
    } 
}; 
template <template<typename> class T> 
struct PARTIAL<T>{ 
    static void test(std::ostream& out) 
    {out << "PARTIAL-OK-END" << endl;} 
}; 
template <template<typename> class T, template<typename> class... TS> 
struct PARTIAL<T, TS...>{ 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-OK" << endl; 
     PARTIAL<TS...>::test(out); 
    } 
}; 

template <class... TS> 
struct FULL { 
    static void test(std::ostream& out) 
    { 
     out << "FULL-PROBLEM" << endl; 
    } 
}; 
template <class T> 
struct FULL<T>{ 
    static void test(std::ostream& out) 
    {out << "FULL-OK-END" << endl;} 
}; 
template <class T, class... TS> 
struct FULL<T, TS...>{ 
    static void test(std::ostream& out) 
    { 
     out << "FULL-OK" << endl; 
     FULL<TS...>::test(out); 
    } 
}; 
template <typename T> 
struct B{}; 
int main() 
{ 
    FULL<int, int, int>::test(cout); 
    PARTIAL<B, B, B>::test(cout); 
    return 0; 
} 

GCC5.3 के उत्पादन (MinGW):

FULL-OK 
FULL-OK 
FULL-OK-END 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-OK-END 

MSVC के उत्पादन:

FULL-OK 
FULL-OK 
FULL-OK-END 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-PROBLEM 

MSVC पूर्ण परिभाषित प्रकार और partials के लिए कोड अलग तरह से पैदा करता है। इसका सबसे अच्छा काम क्या होना चाहिए?

here is demo that works good on GCC

+2

मेरे लिए एक बग की तरह लग रहा। – Arunmu

+0

समस्या को और स्पष्ट करने के लिए '-OK-TERMINATE'' के साथ टर्मिनिंग केस में '-OK' को बदलें। साथ ही, समस्या को अपने कोड को कम करें: कोड जो काम करता है, एक मायने में, अनिच्छुक है। ध्यान दें कि वे "आंशिक प्रकार" नहीं बल्कि "टेम्पलेट टेम्पलेट पैरामीटर" हैं। – Yakk

+0

अपडेट किया गया, मैं कामकाजी भाग को हटाना नहीं चाहता हूं। हो सकता है कि किसी को उपयोग-मामलों – Evgeniy

उत्तर

4

पुनरावर्ती मामले के लिए एक और पैरामीटर जोड़ने से यह सुनिश्चित होगा कि यह समाप्त मामले के लिए चयनित नहीं है:

template <template<typename> class T, template<typename> class T2, template<typename> class... TS> 
//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
struct PARTIAL<T, T2, TS...>{ 
//    ^^^^ 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-OK" << endl; 
     PARTIAL<T2, TS...>::test(out); 
       ^^^^ 
    } 
}; 
+0

दोनों के लिए समाधान मिलेगा हां, यह अपेक्षा के अनुसार काम करता है। धन्यवाद! – Evgeniy

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