stringstream المشغل>> فشل وظيفة ، ولكن يعمل سبيل المثال ؟

StackOverflow https://stackoverflow.com/questions/1823073

  •  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 المشغل ">>" أمرين:

  1. مقتطفات القيمة التالية ووضعه في متغير على يمين المشغل.
  2. الزيادات الحالية موقف تيار على اليسار.

ولذلك ، فإنه يعدل كل من اليسار واليمين المعامل.في الحالة الخاصة بك ، الأيسر معامل قيمة مؤقتة ، مترجم يستهجن على تعديله.

وبعض المشغلين في C و C ++ تتطلب أن القيمة على الجهة اليسرى من المشغل يكون على lvalue، أي أنها يمكن تعديلها.

هنا هو تفسير أكثر اكتمالا.

ولأن القيمة الأولى المستخرجة من stringstream هي الأمراض المنقولة جنسيا :: سلسلة. إذا كان، مثلا، عدد صحيح، فإن (خط) نسخة stringstream العمل.

وليس هناك مشغل دالة عضو >> في stringstream عن الأمراض المنقولة جنسيا :: سلسلة. ولذلك، فإن تيار مؤقت لا يمكن أن تعمل بمثابة lvalue.

وهذا لا يعني أنني أفهم تماما ما سبق ... ولكن ربما كان مكان انطلاق للإجابة أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top