【问题标题】:Why am I getting an error trying to read data from an istringstream?为什么我尝试从 istringstream 读取数据时出错?
【发布时间】:2018-04-16 20:14:34
【问题描述】:

我有以下 C++ 代码:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>
#include <cstring>

using namespace std;

int main() {

   istringstream inSS;
   string title;
   string col1;
   string col2;
   string val;
   int numCommas;
   vector<string> stringData();
   vector<int> intData();

   cout << "Enter a title for the data:" << endl;
   getline(cin, title);
   cout << "You entered: " << title << endl << endl;

   cout << "Enter the column 1 header:" << endl;
   getline(cin, col1);
   cout << "You entered: " << col1 << endl << endl;

   cout << "Enter the column 2 header:" << endl;
   getline(cin, col2);
   cout << "You entered: " << col2 << endl << endl;



   while (1) {

   cout << "Enter a data point (-1 to stop input):" << endl;
   getline(cin, val);



   if(strcmp(val.c_str(), "-1") == 0) {
      break;
   }

   inSS >> stringData >> intData;



   cout << "Data string: " << stringData << endl;
   cout << "Data integer: " << intData << endl;

   }

   return 0;
}

有问题的错误:

main.cpp: In function 'int main()': main.cpp:46:9: error: no match for 'operator>>' (operand types are 'std::istringstream {aka std::cxx11::basic_istringstream<char>}' and 'std::vector<std::cxx11::basic_string<char> >()') 
inSS >> stringData >> intData;
  ~~~^~~~~~~~~~~

这个错误是什么意思?我该如何解决?

【问题讨论】:

  • stringData 是一个向量,向量不会为&gt;&gt; 提供重载。你希望inSS &gt;&gt; stringData &gt;&gt; intData; 做什么?
  • 这很简单。意思是您正在使用basic_istringstream(即inSS)和vector(即stringDataintData),其中没有operator&gt;&gt; 运算符(您在@987654332 中使用@)。
  • 那么我如何将用户输入存储到向量中?对于这个作业,我们应该使用 istringstream 和向量。

标签: c++ iostream most-vexing-parse


【解决方案1】:

错误与多种因素有关。首先,让我们看看这一行:

inSS >> stringData >> intData;

在这里,您尝试从 istringstream 读取到 vector&lt;string&gt;vector&lt;int&gt;。但是,您不能使用流提取运算符从流中读取vector - 没有根本原因,只是标准不允许这样做。您需要一次读取一个元素的数据,这可能需要您重写大量代码。

这里还有一个更微妙的问题。这些行并不像您认为的那样:

vector<string> stringData();
vector<int> intData();

这些行看起来像是声明了名为 stringDataintData 的变量,类型为 vector&lt;string&gt;vector&lt;int&gt;,使用默认构造函数。不幸的是,不管你信不信,C++ 将这些解释为函数原型。例如,第一个是名为stringData 的函数的原型,它不接受任何参数(因此括号之间为空)并返回vector&lt;string&gt;。要解决此问题,请删除括号。随便写

vector<string> stringData;
vector<int> intData;

总结一下:

  • 您需要从根本上对代码进行一些更改,因为您无法从istringstream 读取到vector。这需要更新逻辑。
  • 您需要通过删除括号来修复之前的两个声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多