इस कोड काम करता है:समारोह बनाम सी में चर घोषणा ++
std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
जिससे mapFilename
एक std::string
और void ParseGameState(const std::string&);
है।
और यह नहीं करता है:
game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)
तो ऐसा लगता है कि यह पहचानता एक समारोह घोषणा के रूप में s
और नहीं इस मामले में एक चर घोषणा:
std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
यह त्रुटि है।
वह क्यों है? क्या यह जीसीसी 4.2.1 (ऐप्पल बिल्ड) में एक बग है? या जीसीसी इसे सही तरीके से संभालती है? क्या यह सी ++ मानक में अपरिभाषित है?
धन्यवाद! [यहां डब्ल्यूपी पर] (http://en.wikipedia.org/wiki/Most_vexing_parse) सबसे अधिक परेशान पार्स के बारे में भी एक अच्छी व्याख्या है। – Albert
ऐसा लगता है कि उपर्युक्त 'std :: string' परिवर्तनीय घोषणा C++ 0x में काम नहीं करेगी: क्योंकि 'std :: string' में प्रारंभकर्ता सूची निर्माता है, संपूर्ण' {...} 'को एक ही तर्क के रूप में लिया जाएगा, और' startizer_list 'पैरामीटर को प्रारंभ करने का प्रयास करेगा और संकलित करने में विफल :( –
@ जोहान्स: हाँ, मुझे लगता है कि आप सही हैं। मुझे आश्चर्य है कि यह बेहतर नहीं होगा यदि इसे एक सूची-प्रारंभकर्ता पर विचार करने के बजाय और फिर (केवल अगर वह मौजूद नहीं था) पर विचार करने के बजाय अन्य सीटीर्स पर विचार करें, अगर इसके बजाय यह सिर्फ एक अधिभार सेट बनाया गया है और एक अच्छा मैच चुना है - शायद मामूली समायोजन के साथ जो एक startizer_list मिलान की भलाई के संबंध में कोई रूपांतरण के बराबर नहीं होगा (इस सिद्ध के साथ कि मैंने केवल कुछ मिनटों के बारे में सोचा है, जिससे मुझे एक सूक्ष्म (या यहां तक कि चमकदार) समस्या हो सकती है जो मुझे याद आ रही है) –