2011-01-21 27 views
5

मेरी समस्या कोड शाब्दिक:C++ अधिभार: स्ट्रिंग बढ़ावा बनाम :: समारोह अस्पष्टता

#include <string> 
#include <boost/function.hpp> 

void func (const std::string&) {} 
void func (const boost::function<void()>&) {} 

int main() { 
    func (main); // good 
    func ("bad"); 
    return 0; 
} 

=>

error: call of overloaded ‘func(const char [4])’ is ambiguous 
overload.cpp:4: note: candidates are: void func(const std::string&) 
overload.cpp:5: note:     void func(const boost::function<void()()>&) 

मुझे लगता है मैं स्पष्ट रूप से समारोह (स्ट्रिंग (फोन करके इस को हल कर सकता है पता है "बुरा ")); या एक func (const char *) प्रदान करके, लेकिन मुझे आश्चर्य है कि कॉलर पक्ष को उदाहरण के रूप में और अधिक अधिभार के बिना रखने का कोई तरीका है या नहीं।

शायद बढ़ावा :: enable_if के साथ कुछ? किसी भी संकेत के लिए धन्यवाद।

+0

तुम सच में लगता है कि कारण अधिभार जो लेता है 'बढ़ावा :: function' है आपको लगता है कि अधिभार के बिना संकलित करने के लिए करने की कोशिश की, उदाहरण के लिए है? क्या वह काम करेगा? – Nim

+1

हां इसके boost :: function के कारण होता है। मैंने जो उदाहरण पोस्ट किया है वह पूरी स्थिति को पुन: उत्पन्न करता है। – denis

+0

हाँ - मांगने से पहले का परीक्षण नहीं किया है, बस थोड़ा सा bemused है कि इस मामले था - लगता है कि यह है .. हम्म .. सब कुछ के लिए भार के उपलब्ध कराने की कमी, यकीन नहीं है कि इस के लिए एक साफ समाधान है ... – Nim

उत्तर

4

आप आसानी से इस का समाधान नहीं कर सकता। boost::function<> और std::function<>f() द्वारा कॉल करने योग्य केवल मज़ेदारों का समर्थन नहीं करते हैं, बल्कि (secondArg.*firstArg)() और डेटा सदस्यों द्वारा कॉल करने योग्य सदस्यों के सूचक भी हैं, इसलिए उनके रचनाकार मूल रूप से सब कुछ में फिसलते हैं, और बाद में तय करते हैं कि इस प्रकार के साथ क्या करना है।

इस तरह के एक एसएफआईएनएई परीक्षण वर्ग को लिखने के लिए यह मामूली नहीं है जो निहित रूपांतरणों से गार्ड करता है (और मुझे यह भी सुनिश्चित नहीं है कि यह संभव होगा या नहीं, क्योंकि मानक पुस्तकालय ऐसा नहीं करता है। कुछ कारण)। याद रखें कि एक प्रकार है क्योंकि कई विभिन्न गुणों की प्रतिदेय हो सकता है - यह एक रूपांतरण समारोह सूचक प्रकार आदि पीपी कार्य करने के लिए हो सकता है एक SFINAE वर्ग है कि इस काम कुछ मामलों में एक अंतर्निहित रूपांतरण अस्वीकार और में एक अंतर्निहित रूपांतरण को स्वीकार करने का मतलब है बना सकता है लेखन। वास्तव में स्पष्ट गुणों के आधार पर अन्य मामले।

यदि आप इस अस्पष्टता से बचना चाहते हैं, तो मैं केवल एक अलग फ़ंक्शन नाम चुनने की कोशिश करता हूं या यदि यह एक शॉट की समस्या है, तो कॉलर पक्ष पर कास्टिंग करें।

+1

पुराना प्रश्न देखें, लेकिन भविष्य के पाठकों के लिए 'std :: function' के लिए इस पर एक दोष रिपोर्ट है। देखें [2132। std :: function ambiguity] (http://cplusplus.github.io/LWG/lwg-active.html#2132) जिसे वर्तमान में g ++ 4.8 में लागू किया गया है। –

0

जोड़ना इस:

void func (const char *s) { func(string(s)); } 

अद्यतन

template<class A0, ...> 
void func (const A0 &a0, ...) { 
    func(argize(a0), ...); // convert chars to strig, otherwise jut pass 
} 
+0

समस्या है, कोड वास्तव में ऑटो उत्पन्न होगा और संभवतः पहले से ही बहुत सारे अधिभार जैसे func (स्ट्रिंग) हैं; func (स्ट्रिंग, int); func (स्ट्रिंग, int, boost :: function) और इतने पर। तो char * -overloads जोड़ना दुर्भाग्य से एक विकल्प नहीं है। – denis

+0

@denis अद्यतन – Anycorn

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