2011-01-07 25 views
6

के लिए चेतावनी मैं एक साधारण वर्ग हैनिकाला जा रहा है जी ++ टेम्पलेट पैरामीटर

warning: comparison is always true due to limited range of data type 
:

Int<0, Widget> zero; 

मैं एक छ ++ चेतावनी मिलती है

मैंने ऐसा करने का प्रयास किया, लेकिन मैं यह नहीं समझ पाया कि गैर-प्रकार के टेम्पलेट पैरामीटर के साथ फ़ंक्शन को आंशिक रूप से कैसे विशेषज्ञता दी जाए। ऐसा लगता है कि g ++ में इस चेतावनी को अक्षम करना संभव नहीं हो सकता है। इस चेतावनी को छिपाने का सही तरीका क्या है, या इस विधि को लिखने के लिए यह है कि अगर यह एन == 0 है तो यह हमेशा सच हो जाता है?

धन्यवाद!

+0

एक gcc bug –

+0

जैसा दिखता है क्या आपको 'size_t' की पूरी श्रृंखला की आवश्यकता है, या आप एक हस्ताक्षरित प्रकार के साथ जा सकते हैं? – Bill

+0

@ बिल: दुर्भाग्यवश मुझे पूरी रेंज की आवश्यकता है :-( – JaredC

उत्तर

7

तो के लिए पूर्णांक विशेषज्ञ कर सकते हैं, मैं निम्नलिखित समाधान के साथ आ गया है:

template<size_t N> 
bool GreaterThanOrEqual(size_t index) 
{ 
    return index >= N; 
} 

template<> 
bool GreaterThanOrEqual<0l>(size_t index) 
{ 
    return true; 
} 

तो अब, वर्ग लगता है:

template<size_t N, typename T> 
class Int 
{ 
    bool valid(size_t index) { return GreaterThanOrEqual<N>(index); } 
    T t; 
} 

बेशक, मुझे एक अप्रयुक्त पैरामीटर चेतावनी मिलती है, लेकिन इसके आसपास के तरीके हैं ....

क्या यह एक उचित समाधान है संविधान?

+0

हाँ, मैं कहूंगा कि यह है। – villintehaspam

1

आप एन = 0.

+0

मैंने ऐसा करने की कोशिश की, लेकिन मुझे नहीं लगता कि आप आंशिक रूप से एक गैर-प्रकार के टेम्पलेट पैरामीटर के साथ फ़ंक्शन का विशेषज्ञ कर सकते हैं। क्या आप जानते हैं कि यह कैसे करें? – JaredC

+0

टेम्पलेट कक्षा Int <0, T> {...} – templatetypedef

+0

धन्यवाद। कक्षा वास्तव में मेरे जटिल उदाहरण के बाद अधिक जटिल है, इसलिए पूरे वर्ग को विशेषज्ञता देना एक विकल्प नहीं है। क्या वैध() फ़ंक्शन को केवल विशेषज्ञ बनाने का कोई तरीका है? – JaredC

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