2016-02-23 3 views
6

मैं निम्नलिखित सीपीपी कोड है: जब मैं इस का उपयोग करते हुए दृश्य स्टूडियो 2013 को संकलित करने की कोशिशसंकलक त्रुटि विजुअल C++ के तहत टेम्पलेट विशेषज्ञता का उपयोग कर

#include <iostream> 
#include <limits> 

// C2589 when compiling with specialization, fine when compiling without 
template<typename T> 
void foo(T value = std::numeric_limits<T>::infinity()) 
{ 
} 

// this specialization causes compiler error C2589 above 
template<> 
void foo<float>(float value) 
{ 
} 

int main() 
{ 
    foo<float>(); 
    return 0; 
} 

, मैं निम्न त्रुटि:

..\check2\main.cpp(5) : error C2589: '::' : illegal token on right side of '::' 
..\check2\main.cpp(5) : error C2059: syntax error : '::' 

यदि मैं विशेषज्ञता foo<float> विशेषज्ञता शामिल नहीं करता हूं तो प्रोग्राम ठीक से संकलित करता है। यह कोड gc 4.8.4 के तहत विशेषज्ञता सहित ठीक को संकलित करता है, जो विजुअल सी ++ कंपाइलर के साथ कुछ समस्या इंगित करता है।

क्या कोड सही है और इसे संकलित करना चाहिए? क्या दृश्य सी ++ के लिए कोई कामकाज है?

+0

मेरे पास टी नहीं है वह वीएस2015 पर एक ही त्रुटि है, लेकिन यह [यहां] संकलित करता है (http://ideone.com/ttD7BH)। –

+0

@ बेन: अच्छा बिंदु। मुझे इस साइट के बारे में पता नहीं था। मैं यह नहीं समझ पाया कि वे किस कंपाइलर का उपयोग करते हैं लेकिन चूंकि यह सफलतापूर्वक संकलित करता है, इसलिए मैं इसकी जीसीसी मानता हूं। यह मुझे पहेली करता है कि यह जीसीसी के साथ क्यों संकलित करता है लेकिन वीसी ++ के साथ विफल रहता है। – dkoerner

उत्तर

-1
विशेषज्ञताओं के बजाय

इसे कहते हैं, मैं "टेम्पलेट" कीवर्ड के बिना भार के करते हैं, इस तरह::

विजुअल C++ के लिए

वर्कअराउंड अधिक भार का उपयोग करने के लिए है

template<typename T> 
void foo(T value) 
{ 
} 

void foo(float value) 
{ 
} 

मैं इन्हें जीसीसी और विजुअल स्टूडियो 2012 में उपयोग करता हूं।

+2

यह विशेषज्ञता नहीं है। यह अधिभार है। – NathanOliver

+0

ठीक है, अगर संकलक ठीक से विशेषज्ञता नहीं करेगा, तो समस्या के चारों ओर काम करने के लिए ओवरलोडिंग एक अच्छा तरीका प्रतीत होता है, जो मूल प्रश्न का हिस्सा था। –

+0

मैं सहमत हूं लेकिन * जब मैं विशेषज्ञता करता हूं, तो मैं उन्हें "टेम्पलेट" कीवर्ड के बिना करता हूं, जैसे: * इसका मतलब है कि जब आप कोई विशेषज्ञता करते हैं तो आप बहने वाले कोड का उपयोग करते हैं। मैं आपको सूचित कर रहा हूं कि यह अधिभार नहीं है लेकिन ओवरलोडिंग है।आप इसे पसंद कर सकते हैं * टेम्पलेट को विशेषज्ञता देने के बजाय आप एक अधिभार जोड़ सकते हैं जो 'फ्लोट' * – NathanOliver

3

foo<float>(); पर कॉल करते समय पैरामीटर को छोड़कर आप कंपाइलर को एक कन्डर्रम में रख रहे हैं। कंपाइलर एक साथ निष्कर्ष निकाला है कि विशेष कार्य चुनने का सही कार्य है क्योंकि आप स्पष्ट रूप से <float> कहते हैं, और ऐसा नहीं है क्योंकि कोई पैरामीटर नहीं है। कंपाइलर तब सामान्य संस्करण तक पहुंचता है, लेकिन ऐसा नहीं हो सकता क्योंकि एक विशेष व्यक्ति है। यहां तक ​​कि एचएएल 9000 भी उसको नहीं समझ सका, जब तक यह जीसीसी के साथ नहीं बनाया जाता है। वीसी ++ गलत तरीके से स्थिति को संभालती है। शायद एक बग, और "डिजाइन द्वारा" नहीं।

template<typename T> 
void foo(T value) 
{ 
} 

template<typename T> 
void foo() 
{ 
    foo(std::numeric_limits<T>::infinity()); 
} 

और के रूप में हमेशा की तरह foo<float>();

+0

ओपी द्वारा देखा गया त्रुटि संदेश अजीब है हालांकि। कोई विचार क्यों यह _that_ विशेष त्रुटि संदेश के साथ आ रहा है? – mindriot

+1

मुझे लगता है कि यह एमएसवीएस द्वारा कार्यों के पार्स में एक बग है। क्लेंग, जी ++ और आईसीसी सभी बिना किसी मुद्दे के ओपी की समस्या संकलित करते हैं। – NathanOliver

+0

@ मिंड्रियट मैं केवल अनुमान लगा सकता हूं कि संकलक आधार टेम्पलेट के लिए पहुंचता है, लेकिन "स्पष्ट दिमाग" के साथ नहीं, और इसलिए वास्तव में आधार टेम्पलेट का उपयोग नहीं कर सकता है। वास्तव में कोई फर्क नहीं पड़ता कि वह विशेष संदेश क्यों है। यह एक बग है। – Dialecticus

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