使用Visual Studio代码在C ++中读取输入流时出错

时间:2018-08-17 20:41:07

标签: c++ g++ c++17

#include<iostream>
#include<string>
#include<cstdlib>
#include<sstream>
#include<vector>
#include <iterator>
using namespace std;

int main()
{
    string str;
    unsigned int i;
    vector<string> arr;
    getline(cin,str);

    istringstream it(str);
    vector<string> arr(istream_iterator<string>(),istream_iterator<string>(it));
    arr.push_back('\0');

    //boost::split(arr, str, [](char c){return c == ' ';});
    //auto splitText = str | view::split(' ');
    for(i=0; i<arr.size(); i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

上面的代码显示如下错误: 错误:“ std :: vector> arr(std :: istream_iterator>(*)(),std :: istream_iterator>)”被重新声明为另一种符号

使用g ++构建时。任何帮助或提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

运行g ++时,它还提示问题所在:

a.cpp:13:20: note: previous declaration 'std::vector<std::__cxx11::basic_string<char> > arr' 
     vector<string> arr; 
                    ^~~

这意味着您两次声明arr。首先在第13行,第二次在17行。 这就是

  

声明为另一种符号

表示。


删除第13行的第一个声明可修复此错误消息,但揭示下一个问题

a.cpp:18:9: error: request for member 'push_back' in 'arr', which is of non-class type 'std::vector<std::__cxx11::basic_string<char> >(std::istream_iterator<std::__cxx11::basic_string<char> > (*)(), std::istream_iterator<std::__cxx11::basic_string<char> >)'
 arr.push_back('\0');
     ^~~~~~~~~

这更复杂,这就是为什么@DietmarKühl将问题重复作为问题Most vexing parse: why doesn't A a(()); work?的原因。在这种情况下,第二个答案是最有用的,并通过在参数周围使用花括号来解决该问题

vector<string> arr{istream_iterator<string>(),istream_iterator<string>(it)};