stringstream المشغل>> فشل وظيفة ، ولكن يعمل سبيل المثال ؟
-
10-07-2019 - |
سؤال
أنا أكتب رمز بسيط أنه سيتم استخراج حفنة من اسم الباحث أزواج من ملف.أنا تعديل التعليمات البرمجية الموجودة التي يستخدم فقط:
string chrom;
unsigned int size;
while ( cin >> chrom >> size ) {
// save values
}
ولكن أريد أن استخدام آخر (مماثلة) إدخال ملف له نفس أول عمودين ، ولكن تليها البيانات الأخرى (التي سيتم تجاهل).لذلك أنا أكتب:
string chrom;
unsigned int size;
string line;
while ( getline(cin, line) ) {
if( stringstream(line) >> chrom >> size ) {
// save values
}
}
ولكن هذا فشل في تجميع ، وإعطاء نموذجية فاحشة std lib قالب يقذف:
error: no match for "operator>>" in "std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >(((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& line))), std::operator|(_S_out, _S_in)) >> chrom"
istream:131: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
[...another dozen lines...]
صحيح.الخط ليس std::string, ولكن بعض الاختلاف من الأمراض المنقولة جنسيا::basic_string ، إلخ.ومع ذلك صراحة على إنشاء stringstream يعمل.
string chrom;
unsigned int size;
string line;
while ( getline(genome, line) ) {
stringstream ss(line);
if ( ss >> chrom >> size ) {
// save values
}
// Discard remainder of line
}
لماذا ؟ ما هو الخطأ مع القضية ؟ على مثال basic_io في المفيد دائما cplusplus.com يعمل لماذا لا قانون بلدي ؟
تحديث:آخر نقطة مرجعية:مؤقت stringstream يعمل عند أول قيمة المستخرج هو الباحث بدلا من سلسلة:
unsigned int chrom; // works as int...
unsigned int size;
string line;
while ( getline(cin, line) ) {
if( stringstream(line) >> chrom >> size ) {
// save values
}
}
المحلول
ثلاث مجموعات من وظائف الأعضاء و مجموعة من الوظائف الزائد هذا "استخراج المشغل" ( > > ) ، http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/.
- stringstream(خط);--إنشاء كائن مؤقت
- stringstream ss(خط) ؛ -- الطبيعي الكائن.
عندما "الكروم" هو int, مشغل >> طاقتها كما الحسابية النازع الذي هو وظائف الأعضاء.سواء العادي كائن أو كائن مؤقت تعمل بشكل جيد.
عندما "الكروم" هو سلسلة المشغل >> يجب أن يكون فوق طاقتها كما istream& operator>> (istream& is, char* str)
, هذه هي الوظائف التي يجب أن تأخذ مرجع كائن كما المعلمة.ومع ذلك ، وبالنظر إلى كائن مؤقت ، لا يسمح لنا بالمرور الكائنات المؤقتة غير const الإشارة في المعيار C++.الزائد وظيفة لا يمكن الحصول على مرجع كائن مؤقت إلا إذا كان الزائد وظيفة يعرف istream& operator>> (const istream& is, char* str)
.للأسف ليس هذا هو الواقع.وظيفة(ق) لا يمكن طاقتها في كائن مؤقت الحالة ، وبالتالي إعطاء الخطأ مثل error: no match for function...
نصائح أخرى
إلى التوسع في جون ويلدون الجواب ، extrace المشغل ">>" أمرين:
- مقتطفات القيمة التالية ووضعه في متغير على يمين المشغل.
- الزيادات الحالية موقف تيار على اليسار.
ولذلك ، فإنه يعدل كل من اليسار واليمين المعامل.في الحالة الخاصة بك ، الأيسر معامل قيمة مؤقتة ، مترجم يستهجن على تعديله.
وبعض المشغلين في C و C ++ تتطلب أن القيمة على الجهة اليسرى من المشغل يكون على lvalue، أي أنها يمكن تعديلها.
هنا هو تفسير أكثر اكتمالا.
ولأن القيمة الأولى المستخرجة من stringstream هي الأمراض المنقولة جنسيا :: سلسلة. إذا كان، مثلا، عدد صحيح، فإن (خط) نسخة stringstream العمل.
وليس هناك مشغل دالة عضو >> في stringstream عن الأمراض المنقولة جنسيا :: سلسلة. ولذلك، فإن تيار مؤقت لا يمكن أن تعمل بمثابة lvalue.
وهذا لا يعني أنني أفهم تماما ما سبق ... ولكن ربما كان مكان انطلاق للإجابة أفضل.