c – stringstream operator >>作为函数失败,但作为实例工作?

c – stringstream operator >>作为函数失败,但作为实例工作?,第1张

概述我正在编写简单的代码,它将从文件中提取一堆名称,int对.我正在修改刚使用的现有代码: string chrom;unsigned int size;while ( cin >> chrom >> size ) { // save values} 但我想使用另一个(类似的)输入文件,它具有相同的前两列,但后跟其他数据(将被忽略). 所以我写道: string chrom;unsi 我正在编写简单的代码,它将从文件中提取一堆名称,int对.我正在修改刚使用的现有代码:

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::allocator<char> >&)((const std::basic_string<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...]

对. line不是std :: string,而是std :: 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}

为什么?第一种情况有什么问题? example basic_io总是有用的cplusplus.com工作,为什么我的代码不行?

更新:
另一个参考点:当提取的第一个值是int而不是字符串时,临时字符串流工作:

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(line); – 创建一个临时对象
> stringstream ss(line); – 一个普通对象.

当“chrom”为int时,运算符>>被重载为算术提取器,它是成员函数.普通对象或临时对象都可以正常工作.

当“chrom”是字符串时,运算符>>应该像istream& amp; *** 作符GT;> (istream& is,char * str),这是一个全局函数,它应该将对象引用作为参数.但是,给定临时对象,我们不允许在标准C中通过非const引用传递临时对象.除非将重载函数定义为istream& amp;过载函数,否则无法获取临时对象的引用. *** 作符GT;> (const istream& is,char * str).不幸的是,这不是事实.函数不能在临时对象的情况下重载,因此给出错误如错误:不匹配函数…

总结

以上是内存溢出为你收集整理的c – stringstream operator >>作为函数失败,但作为实例工作?全部内容,希望文章能够帮你解决c – stringstream operator >>作为函数失败,但作为实例工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存