2011-02-06 18 views
5

मेरे पास पोको का एक std :: नक्शा है :: कोई भी जिसे मैं पुन: सक्रिय करने और स्ट्रीम करने के लिए आउटपुट करने का प्रयास कर रहा हूं लेकिन मुझे एक कंपाइलर त्रुटि मिल रही है। मेरे कोड के नीचे है: कि लाइन परपोको के std :: मानचित्र को पुन: सक्रिय करने में असमर्थ :: कोई भी

map<string, Poco::Any>::const_iterator it; 
map<string, Poco::Any>::const_iterator end = _map.end(); 
map<string, Poco::Any>::const_iterator begin = _map.begin(); 
for(it = begin; it != end; ++it) { 
    const std::type_info &type = it->second.type(); 

    // compile error here: 
    os << " " << it->first << " : " << Poco::RefAnyCast<type>(it->second) << endl; 
} 

2 त्रुटियों:

'type' cannot appear in a constant-expression 
no matching function for call to 'RefAnyCast(Poco::Any&)' 

अद्यतन:

मैं समझता हूँ कि टेम्पलेट्स प्रकार जबकि संकलन समय (हैं) क्रम इतना है नहीं होगा काम। उस पर रेखांकित करने के लिए धन्यवाद। इसके अलावा डायनेमिकएनी काम नहीं करेगा क्योंकि यह केवल उन प्रकारों को स्वीकार करता है जिनमें डायनामिकएनीहोल्डर कार्यान्वयन है, आदर्श नहीं। एकमात्र नियम जिसे मैं प्रकारों पर लगा देना चाहता हूं वह है कि उनके पास < < अधिभारित है।

नीचे मैं जो कर रहा हूं वह नीचे है, डिग्री के लिए काम करता है, लेकिन केवल ज्ञात प्रकारों को डंप करता है, जो कि मैं बाद में नहीं हूं।

string toJson() const { 
    ostringstream os; 
    os << endl << "{" << endl; 
    map<string, Poco::Any>::const_iterator end = _map.end(); 
    map<string, Poco::Any>::const_iterator begin = _map.begin(); 
    for(map<string, Poco::Any>::const_iterator it = begin; it != end; ++it) { 
     const std::type_info &type = it->second.type(); 
     os << " " << it->first << " : "; 

     // ugly, is there a better way? 
     if(type == typeid(int)) os << Poco::RefAnyCast<int>(it->second); 
     else if(type == typeid(float)) os << Poco::RefAnyCast<float>(it->second); 
     else if(type == typeid(char)) os << Poco::RefAnyCast<char>(it->second); 
     else if(type == typeid(string)) os << Poco::RefAnyCast<string>(it->second); 
     else if(type == typeid(ofPoint)) os << Poco::RefAnyCast<ofPoint>(it->second); 
     else if(type == typeid(ofVec2f)) os << Poco::RefAnyCast<ofVec2f>(it->second); 
     else if(type == typeid(ofVec3f)) os << Poco::RefAnyCast<ofVec3f>(it->second); 
     //else if(type == typeid(ofDictionary)) os << Poco::RefAnyCast<ofDictionary>(it->second); 
     else os << "unknown type"; 

     os << endl; 
    } 
    os<< "}" << endl; 
    return os.str(); 
} 

उत्तर

7

रनटाइम प्रकार की जानकारी टेम्पलेट को तुरंत चालू करने के लिए उपयोग नहीं किया जा सकता है। type_info का एक उदाहरण जिसका मूल्य केवल प्रोग्राम चलाए जाने पर ही जाना जाएगा, संकलक इस कोड को संकलित करते समय int, std::string या struct FooBar जैसे जादुई रूप से बदल नहीं जाता है।

मैं पोको पुस्तकालय पता नहीं है, लेकिन शायद आप उनके अन्य किसी भी प्रकार की इस्तेमाल कर सकते हैं, DynamicAny (documentation देखें) जो उम्मीद है कि आप outputting के लिए std::string को संग्रहीत मूल्य परिवर्तित करने की अनुमति होगी:

os << " " << it->first << " : " << it->second.convert<std::string>() << endl; 
+3

+1 । शायद यह जोर दिया जाना चाहिए कि सी ++ टेम्पलेट एक संकलित समय की बात है और टेम्पलेट पैरामीटर को संकलन-समय पर जाना जाना चाहिए। यह देखते हुए कि ओपी यह नहीं समझ सका कि क्या गलत था, यह ओपी को खबर हो सकती है। – sellibitze

+0

"शायद यह जोर दिया जाना चाहिए कि सी ++ टेम्पलेट एक संकलित समय की बात है और टेम्पलेट पैरामीटर को संकलन समय पर जाना जाना चाहिए"। हां यह पूरी तरह से धन्यवाद इसे स्पष्ट करें। दुर्भाग्य से डायनेमिकएनी वास्तव में * किसी * प्रकार का समर्थन नहीं करता है, केवल उन्हीं के लिए जिनके लिए डायनामिकएनीहोल्डर कार्यान्वयन होता है, इसलिए उपयोगकर्ता प्रकारों (जैसे वेक्टर, मैट्रिस इत्यादि) का समर्थन नहीं करेंगे, जिनमें << ऑपरेटर ओवरलोड हो गया है, लेकिन मैं यदि संभव हो तो सब कुछ DynamicAnyHolderImpl का विस्तार करने से बचाना चाहेंगे। – memo

+0

@Memo: दुर्भाग्य से हुड के तहत केवल कंक्रीट वैल्यूहोल्डिंग क्लास (बूस्टर 'धारक ' में) को पता चल जाएगा कि आयोजित मूल्य को कैसे आउटपुट किया जाए। ऐसा लगता है कि यह आगंतुकों को स्वीकार करने का कोई तरीका नहीं हो सकता है, इसलिए एकमात्र विकल्प उस विधि को जोड़ना हो सकता है जो मान को आउटपुट करता है, या कम से कम 'to_string' विधि। http://codepad.org/NICm5r2r केवल 'बूस्ट :: किसी भी' को 'to_string' विधि ('स्ट्रिंगर ' के लिए संशोधित किया गया है, जो कि लागत बढ़ाने की संभावना जोड़ने के लिए संशोधित है, लेकिन' boost :: lexical_cast' के साथ डिफ़ॉल्ट कार्यान्वयन होना चाहिए 'const char *' को छोड़कर सभी "cout-able" ऑब्जेक्ट्स के लिए ठीक रहें। – UncleBens

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

  • कोई संबंधित समस्या नहीं^_^