2010-10-30 23 views
5

मैं क्यूटी निर्माता 2.0.1 का उपयोग कर निम्न प्रोग्राम को संकलित करने का प्रयास कर रहा हूं:Mtrw में ptr_fun (tolower) संकलित क्यों नहीं करता है?

void f() 
{ 
    string a = "abc"; 
    transform(a.begin(), a.end(), a.begin(), ptr_fun(tolower)); 
} 

mingw निम्न त्रुटि फेंकता है:

ptr_fun (< अनसुलझा अधिभारित फ़ंक्शन प्रकार>) पर कॉल के लिए कोई मिलान करने वाला फ़ंक्शन नहीं है

यह फ़ंक्शन वीसी ++ 2010 एक्सप्रेस के साथ ठीक से संकलित करता है। मिंगव के साथ क्या गलत है?

धन्यवाद।

उत्तर

5
समस्या

अस्पष्टता समारोह टेम्पलेट द्वारा शुरू की है

template <class charT> charT tolower(charT c, const locale& loc); 

मुझे लगता है कि MinGW एक हेडर का अपने कार्यक्रम से परोक्ष रूप से शामिल किया गया है <locale> इसमें शामिल है, जबकि वीसी ++ नहीं था।

आप एक कलाकारों के साथ tolower disambiguating करके इसे ठीक कर सकते हैं:

typedef int (*foo)(int); 
ptr_fun((foo)tolower); 

या अगर आप की तरह रखरखाव प्रोग्रामर आप पर जूते फेंकने के लिए:

ptr_fun((int (*)(int))tolower); 

ध्यान दें कि के रूप में आर्मेन कहते हैं, आप डॉन ' टी वास्तव में यहां ptr_fun की आवश्यकता है। यह एक यूनरी फ़ंक्शन को एक अनुकूलनीय यूनरी फ़ंक्शन में परिवर्तित करता है, लेकिन transform को इसके पैरामीटर को अनुकूलनीय होने की आवश्यकता नहीं है। अंतर यह है कि इस प्रकार ने argument_type और result_type के लिए टाइप किए गए टाइप किए गए हैं। कच्चे फ़ंक्शन प्रकार नहीं हैं, ptr_fun एक फ़ैक्टर प्रकार देता है जो करता है।

अंत में, यह नहीं सामान्य रूप में सुरक्षित पर एक char अगर char अपने मंच पर हस्ताक्षर किया गया है सी tolower कॉल करने के लिए है। आपका उदाहरण स्ट्रिंग ठीक है, क्योंकि "abc" में पात्रों में से कोई भी नकारात्मक है, लेकिन आप कुछ इस तरह करना चाहिए:

char fixed_tolower(char c) { 
    return tolower((unsigned char)c); 
} 

transform(..., fixed_tolower); 

या इनलाइनिंग का एक बेहतर मौका के लिए:

struct fixed_tolower : unary_function<char, char> { 
    char operator()(char c) const { 
     return tolower((unsigned char)c); 
    } 
}; 

transform(..., fixed_tolower()); 

मैं हेवन यह जांच नहीं की गई है कि क्या यह वास्तविक रूप से tolower के मिंगव कार्यान्वयन के नकारात्मक संदर्भों पर एमएफडब्ल्यू कार्यान्वयन के पीओवी से या तो पीओवी से जीसीसी में कोई फर्क नहीं पड़ता है।

1

आप क्यों नहीं बस

transform (a.begin, a.end(), a.begin(), tolower); 

कहें?

+0

प्रश्न से जुड़े कारणों से, क्यों नहीं ;-) –

0

मिंगव के साथ कुछ भी गलत नहीं है। tolower के लिए कई भार के, संदेश पैदा कर रहे हैं "अनसुलझे अतिभारित समारोह।

आप जो अधिभार आप उपयोग करना चाहते निर्दिष्ट करने की आवश्यकता, eigher कुछ के माध्यम से (int)(*)(char)tolower या एक मध्यवर्ती चर डाली।

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