gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:19:12 24 4
gpt4 key购买 nike

我正在编写简单的代码,从文件中提取一堆名称、整数对。我正在修改仅使用的现有代码:

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
}
}

但这无法编译,给出了典型的淫秽标准库模板:

 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...]

没错。 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 而不是字符串时,临时 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 ss(line);-- 一个普通对象。

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

当“chrom”为字符串时,运算符>>应该重载为istream& operator>> (istream& is, char* str),这是一个全局函数,应该以对象引用为参数.然而,给定临时对象,我们不允许在标准 C++ 中通过非常量引用传递临时对象。除非重载函数定义为istream& operator>> (const istream& is, char* str),否则重载函数无法获取临时对象的引用。不幸的是,事实并非如此。在临时对象情况下不能重载函数,因此会发出类似 error: no match for function...

的错误

关于c++ - stringstream operator>> 作为函数失败,但作为实例工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com