我写一些简单的代码,这将取一堆名,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操作者">>"做两件事:

  1. 提取的下一个值并将它纳入变量的操作员。
  2. 增加流的当前位置。

因此,它修改其左右的操作数。在你的情况下,左手操作数是一个临时价值,并编译器皱眉头上的修改。

C和C一些运营商++要求在运算符左侧的值是一个左值,即,使得它们可以被修改。

这里是一个更完整的解释。

由于从字符串流中提取的第一个值是一个std ::字符串。如果是,比方说,一个int,则字符串流(线)的版本会工作。

有没有成员函数operator >>在字符串流进行的std :: string。因此,临时流不能用作左值。

不,我完全理解上述...但也许这是一个更好的答案一个首发位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top