2016-12-06 9 views
6

क्या निम्न प्रोग्राम अनुपालन C++ 11 है? यदि हां, तो क्या आप एक विशिष्ट एमएसवीसी बग के बारे में जानते हैं जो इसे ट्रिगर करता है? और/या एक संभावित काम के आसपास?MSVC2015 decltype पैरामीटर प्रकार ओवरलोडेड टेम्पलेट फ़ंक्शन

#include <iostream> 

struct A {}; 
struct B {}; 

constexpr A aaa = {}; 
constexpr B bbb = {}; 

template <typename T> 
void foo(T, decltype(aaa)) { std::cout << "a"; } 

template <typename T> 
void foo(T, decltype(bbb)) { std::cout << "b"; } 
//^C2995 'void foo(T,unknown-type)': function template has already been defined 

int main() 
{ 
    foo(0, aaa); 
    foo(0, bbb); 
} 

वास्तविक प्रकार decltype के लिए प्रतिस्थापित रहे हैं तो यह काम करता है, लेकिन व्यवहार में इन प्रकार भी पुन: पेश करने जटिल हो जाते हैं और मैं उन्हें कल्पित नामों के लिए नहीं करना चाहते। निम्नलिखित मामूली संशोधन के साथ मेरे लिए

+0

संकलित जीसीसी/क्लैंग के साथ ठीक है, और मुझे सामान नहीं दिख रहा है जो सी ++ 11 अनुरूप नहीं है। – Jarod42

उत्तर

4

काम करता है (वी.एस. 2015/v140):

#include <iostream> 

struct A {}; 
struct B {}; 

constexpr A aaa = {}; 
constexpr B bbb = {}; 

using A_type = decltype(aaa); 
using B_type = decltype(bbb); 

template <typename T> 
void foo(T, A_type) { std::cout << "a"; } 

template <typename T> 
void foo(T, B_type) { std::cout << "b"; } 

int main() 
{ 
    foo(0, aaa); 
    foo(0, bbb); 
} 

लेकिन इस प्रकार एक ही त्रुटि (यकीन नहीं क्या इसके बारे में करने के लिए) पैदावार:

template <typename T> 
struct TypeWrapper { 
    using type = T; 
}; 

template <typename T> 
void foo(T, typename TypeWrapper<decltype(aaa)>::type) { std::cout << "a"; } 

template <typename T> 
void foo(T, typename TypeWrapper<decltype(bbb)>::type) { std::cout << "b"; } 
+0

मैंने सोचा कि एमएसवीसी उपनामों के पाठ प्रतिस्थापन कर रहा था। मुझे आश्चर्य है कि यह काम कर रहा है। मैं कुछ अज्ञात बग से निपट रहा था, जो लंबे समय से पहले 'अज्ञात-प्रकार' से संबंधित नहीं था, यह जानकर अच्छा था कि उपनाम काम कर रहे हैं। –

+0

@GuillaumeRacicot: टाइप उपनाम को एक नया अलग प्रकार नहीं माना जाता है, है ना? मैं अपेक्षा करता हूं कि यह खुद को काम न करे, अब आप इसे लाएंगे। जाहिर है, यह ऐसा प्रकार नहीं है जो संकलक को भ्रमित करता है लेकिन 'decltype()' निर्माण करता है, और मेरा संशोधन इसे एक अलग संदर्भ में रखता है जहां संकलक _can_ इसे सही तरीके से संसाधित करता है। कम से कम यह मेरा वर्तमान सिद्धांत है। –

+0

स्पष्ट रूप से यह भी काम करता है: 'टेम्पलेट रैप = ​​टी का उपयोग करके;' फिर पैरामीटर सूची में 'wrap ' डाल दें। –

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