为什么我在c++的visualstudio中尝试将字符串分配给istringstream对象时出错



下面的类接受用户的string行作为输入。我的目标是将其存储在istringstream iss中,然后将istringstream iss中的各种数据提取到各种变量中。但是,当我试图用string user_input初始化iss时,我在编译文件时遇到了这个错误

错误C2064:术语的计算结果不是采用1个参数的函数

我认为问题出在iss{user_input};行。请解释我出现此错误的原因。

_input.h头文件

#pragma once
#include <string>
#include<sstream>
#include "_date.h"
#include "_time.h"
using namespace std;
//definition of class input
class _input
{
string user_input;
istringstream iss;
//datamembers to be sent
int esno,eday, emonth, eihours, eimins, eohours, eomins, emo;
char eiap, eoap;
string enotes;
public:
_input();
void get_input();
void process_data();
};

_input.cpp文件

#include "_input.h"
_input::_input() : user_input { "Nothing Entered" }, iss{ "" }, esno{ 0 }, eday{ 0 }, emonth{ 0 },
eihours{ 0 }, eimins{ 0 }, eohours{ 0 }, eomins{ 0 }, emo{ 0 }, eiap{ 'n' }, eoap{ 'n' }, enotes{ "" }
{
}
void _input::get_input() // to store in iss
{
cout << "Enter the entry : Format (Date - In Time - Out Time - Money Owed - Notes)" << endl;
getline(cin, user_input);
iss{user_input};  //THIS IS WHERE I GET THE ERROR
}
void _input::process_data()
{
iss >> eday >> emonth >> eihours >> eimins >> eiap >> eohours >> eomins >> eoap >> emo >> enotes;
++esno;

}

简短的版本是您不能初始化一个对象两次。iss被声明和构造为类的私有成员。当您尝试iss{user_input}时,它已经存在——这是不允许的。您不需要初始化,只需将iss的内容替换为user_input中的内容即可。为此,您使用std::basic_istringstream::str。成员函数str允许您获取或设置istringstream的内容。

一个简短的例子:

#include <iostream>
#include <sstream>
#include <string>
int main (void) {

std::istringstream iss {};                      /* iss is declared/constructed */
std::string s {};

std::cout << "enter s: ";
if (!getline(std::cin, s))
return 1;

iss.str(s);                                     /* replace iss content with s */
std::cout << "iss has: "<< iss.str() << 'n';   /* check iss contains s */
while (iss >> s)                                /* read each string in iss */
std::cout << s << 'n';                     /* output string */
}

示例使用/输出

$ ./bin/iss
enter s: my dog has fleas
iss has: my dog has fleas
my
dog
has
fleas

另外一个提示,看看为什么"使用命名空间std;"被认为是不好的做法?。

仔细看看,如果你还有问题,请告诉我。

iss{user_input};  //THIS IS WHERE I GET THE ERROR

语法表明,在get_input中重新构造iss为时已晚(而且是非法的(。相反,流必须用新的user_input重新/初始化。

iss.clear();
iss.str(user_input);

最新更新