यह जीथब पर जैव सूचना विज्ञान के लिए एक बहुत लोकप्रिय सी ++ परियोजना है:

https://github.com/jts/sga/blob/master/src/Util/ClusterReader.cpp

एक पंक्ति है:

bool good = getline(*m_pReader, line);

मैं इस लाइन को संकलित नहीं कर सकता और मुझे नहीं पता कि लेखक ने ऐसा क्यों किया।

दस्तावेज़ीकरण के अनुसार, getline बूल नहीं एक स्ट्रिंग देता है . दरअसल, प्रोजेक्ट को संकलित करने का प्रयास करते समय मुझे यही मिलता है:

ClusterReader.cpp: In member function ‘bool 
ClusterReader::readCluster(ClusterRecord&)’:
ClusterReader.cpp:70:41: error: cannot convert ‘std::basic_istream<char>’ to ‘bool’ in initialization
 bool good = getline(*m_pReader, line);

सी ++ कोड ने स्ट्रिंग को बूल में क्यों परिवर्तित किया? यह कैसे संभव होगा?

3
SmallChess 4 मई 2017, 09:34

2 जवाब

सबसे बढ़िया उत्तर

std::getline वापस नहीं आता std::string, लेकिन std::basic_istreamgetline(*m_pReader, line); के लिए, यह केवल *m_pReader लौटाता है।

std::basic_istream को std के माध्यम से bool में परिवर्तित किया जा सकता है: :basic_ios::operator bool (C++11 के बाद से),

यदि स्ट्रीम में कोई त्रुटि नहीं है और I/O संचालन के लिए तैयार है, तो true लौटाता है। विशेष रूप से, रिटर्न !fail()

C++11 से पहले इसे परोक्ष रूप से void* में बदला जा सकता था, जिसे bool में भी बदला जा सकता था।

ऐसा लगता है कि आपका कंपाइलर निहित रूपांतरण करने में विफल रहा, आप !fail() को वर्कअराउंड के रूप में उपयोग कर सकते हैं, उदा।

bool good = !getline(*m_pReader, line).fail();
3
songyuanyao 4 मई 2017, 09:49

यह प्रश्न देखें।

उपयोगकर्ता लोकी अस्तरी ने अपने जवाब में लिखा:

getline() वास्तव में उस स्ट्रीम का संदर्भ देता है जिस पर इसका उपयोग किया गया था। जब स्ट्रीम का उपयोग बुलियन संदर्भ में किया जाता है तो इसे एक अनिर्दिष्ट प्रकार (सी ++ 03) में परिवर्तित कर दिया जाता है जिसे बूलियन संदर्भ में उपयोग किया जा सकता है। सी ++ 11 में इसे अपडेट किया गया था और इसे बूल में बदल दिया गया है।

इसका मतलब है कि आप शायद अप-टू-डेट कंपाइलर (C++03 या इससे भी बेहतर C++11) का उपयोग नहीं करते हैं। यदि आप g++ या gcc का उपयोग करते हैं, तो कमांड में -std=c++11 जोड़ने का प्रयास करें।

2
Community 23 मई 2017, 15:34