基于循环的C ISTRINGSTREAM范围没有开始成员

C++ istringstream range-based for loop has no begin member

本文关键字:范围 ISTRINGSTREAM 成员 开始 于循环 循环      更新时间:2023-10-16

我正在尝试为用户输入的特殊字符进行基本的解析。这篇文章显示了如何在Whitespace上拆分,但是当我尝试将字符串存储到字符串的向量中时,我会遇到此编译错误。

repl.cpp: In function ‘int main(int, char**)’:
repl.cpp:52:25: error: range-based ‘for’ expression of type ‘std::__cxx11::basic_istringstream<char>’ has an ‘end’ member but not a ‘begin’
         for (string s : iss)
                         ^~~
repl.cpp:52:25: error: ‘std::ios_base::end’ cannot be used as a function
make: *** [repl.o] Error 1

这是下面的完整代码:

#include <cstdlib>                                                                                         
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
using namespace std;
int main(int argc, char *argv[])
{
    size_t pos;
    int pipe = 0;
    int pid = 0;
    vector <size_t> positions;
    vector <string> arguments;
    do  
    {   
        cout << "repl$ ";
        getline(cin, cmd);
        pos = cmd.find( "|", 0); 
        while ( pos != string::npos )
        {   
            positions.push_back(pos);
            pos = cmd.find( "|", pos+1);
            pipe += 1;
            pid += 1;
        }   
        istringstream iss(cmd);
        while (iss >> cmd)
            arguments.push_back(cmd);  
        for (string s : iss)
            cout << s << endl;
  
    } while (cmd != "q");
    return EXIT_SUCCESS;
}             

您需要使用std::istream_iterator<std::string>读取连续字符串。Boost有一个包装器来创建一个伪容器,代表istream读取的对象的顺序;例如:

for (const auto& s : boost::range::istream_range<std::string>(iss))
    std::cout << s << 'n';

在这种特定情况下的一种替代方案是直接复制到输出迭代器:

std::copy(std::istream_iterator<std::string>{iss},
          std::istream_iterator<std::string>{},
          std::ostream_iterator<std::string>{std::cout, 'n'});