2009-03-14 16 views
7

पर काम करता है निम्नलिखित कोड पर विचार करेंकि 32 और 64-बिट

template<unsigned int N> void foo(std::bitset<N> bs) 
{ /* whatever */ } 

int main() 
{ 
    bitset<8> bar; 
    foo(bar); 
    return 0; 
} 

जी ++ 64 बिट पर इस बारे में शिकायत क्योंकि < 8> एक अहस्ताक्षरित लंबे int के रूप में व्याख्या हो जाता है एक std :: bitset टेम्पलेट लिखने के लिए कैसे , जो बिल्कुल टेम्पलेट से मेल नहीं खाता है। यदि मैं टेम्पलेट को बिना हस्ताक्षर किए गए लंबे int कहने के लिए बदलता हूं, तो 32-बिट संकलन शिकायत करते हैं।

जाहिर है एक तरह से इसे ठीक करने के < 8> bitset बदलने के लिए < 8ul bitset करने के लिए> है, लेकिन किसी भी तरह से इतना है कि यह एक अंकीय की जो कुछ भी डिफ़ॉल्ट व्याख्या के साथ काम करेंगे करने के लिए टेम्पलेट हिस्सा फिर से लिखें है शाब्दिक है?

उत्तर

7

समस्या यह नहीं है कि आप 8u या 8 लिखते हैं या नहीं। समस्या को आपके फ़ंक्शन टेम्पलेट के टेम्पलेट पैरामीटर के प्रकार से करना है। इसका प्रकार की घोषणा में इस्तेमाल किए गए एक से मेल खाना है।

: - (उसके बाद ही आकार है कि स्वीकार किया जा सकता निश्चित रूप से 1 है bool भी) सरणी आयाम, जिसके लिए आप किसी भी पूर्णांक प्रकार का उपयोग कर सकते हैं कि मानक (अनुभाग 23.3.5)

namespace std { 
    template<size_t N> class bitset { 
    public: 
    // bit reference: 
     ... 

अपवाद के अनुसार size_t है

// better size_t (non-negative), but other types work too 
template<int N> void f(char(&)[N]); 

लेकिन अन्य अवसरों में, प्रकारों का मिलान करना होता है। ध्यान दें कि यह केवल स्वत: परीक्षण टेम्पलेट तर्कों के लिए सच है, लेकिन स्पष्ट रूप से दिए गए लोगों के लिए नहीं। इसका कारण यह है कि कटौती वाले लोगों के लिए, संकलक वास्तविक टेम्पलेट तर्कों के बीच सबसे अच्छा मिलान और इसे कॉल से प्राप्त करने के लिए सर्वोत्तम मिलान का पता लगाने की कोशिश करता है। कई अन्यथा निहित रूपांतरण तब अस्वीकृत हैं। यदि आप तर्क स्पष्ट (size_t का उपयोग कर अब मेरी बात बनाने के लिए के समाधान अनदेखी) डाल आप उपलब्ध रूपांतरण की पूरी श्रृंखला है

template<int N> void foo(std::bitset<N> bs) 
{ /* whatever */ } 

int main() { 
    bitset<8> bar; 
    foo<8>(bar); // no deduction, but full range of conversions 
} 
0

एक अंकीय शाब्दिक कोई फर्क नहीं पड़ता मंच

+0

आगे समस्या यह है कि मैं सिर्फ नहीं कर सकता यह टेम्पलेट क्योंकि तब है बिटसेट शिकायत करता है कि इसका तर्क एक हस्ताक्षरित int होना चाहिए –

3

उपयोग size_t एक पूर्णांक के रूप में व्याख्या की जानी चाहिए। तो कम से कम एमएसडीएन कहते हैं।

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