stringstream员>>失败的功能,但可以作为实例?
-
10-07-2019 - |
题
我写一些简单的代码,这将取一堆名,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
}
}
但是,这无法汇编,使典型的淫秽性病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...]
正确的。线不是一种标准::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、操作员>>超载为算术提取这是件的功能。这两种通常的目的或临时的目的。
当"铬"string,操作者>>应当是超载以 istream& operator>> (istream& is, char* str)
, 这是一个全球性功能,其应当采取的对象引用作为参数。然而,鉴于临时目的,我们不允许通过暂时性目的通过非常量的参考标准。载功能不能获得参考的暂时的对象,除非该过载功能定义为 istream& operator>> (const istream& is, char* str)
.不幸的是,这不是事实。功能(s)不能重载的临时性对象的情况,并因此给出了错误喜欢 error: no match for function...
其他提示
扩大在约翰*韦尔登的答复,extrace操作者">>"做两件事:
- 提取的下一个值并将它纳入变量的操作员。
- 增加流的当前位置。
因此,它修改其左右的操作数。在你的情况下,左手操作数是一个临时价值,并编译器皱眉头上的修改。
C和C一些运营商++要求在运算符左侧的值是一个左值,即,使得它们可以被修改。
这里是一个更完整的解释。
由于从字符串流中提取的第一个值是一个std ::字符串。如果是,比方说,一个int,则字符串流(线)的版本会工作。
有没有成员函数operator >>在字符串流进行的std :: string。因此,临时流不能用作左值。
不,我完全理解上述...但也许这是一个更好的答案一个首发位置。