2017-04-18 39 views
0

我想做一个基本的解析为用户输入的特殊字符的REPL。 This后显示如何拆分空白,但当我尝试将字符串流存储到字符串的向量时,我得到此编译错误。C++ istringstream基于范围的循环没有开始成员

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> arguements; 
    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) 
      arguements.push_back(cmd); 

     for (string s : iss) 
      cout << s << endl; 

    } while (cmd != "q"); 
    return EXIT_SUCCESS; 
}    
+5

您是不是要找'的(字符串s:arguements)'?流不能像那样工作。 –

回答

2

您需要使用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'});