在C ++中尝试在Visual Studio中将字符串分配给istringstream对象时,为什么会出错?

问题描述

以下类将string行作为来自用户的输入。我的目标是将其存储在istringstream iss中,然后从istringstream iss提取各种数据到各种变量中。但是,当我尝试使用iss初始化string user_input时,在编译文件时出现此错误

错误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{user_input};  //THIS IS WHERE I GET THE ERROR

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

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

简短的版本是您不能两次初始化一个对象。 Traceback (most recent call last): File "manage.py",line 16,in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py",line 401,in execute_from_command_line utility.execute() File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py",line 395,in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.8/site-packages/django_jenkins/management/commands/jenkins.py",line 47,in run_from_argv super(Command,self).run_from_argv(argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/test.py",line 23,in run_from_argv super().run_from_argv(argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py",line 330,in run_from_argv self.execute(*args,**cmd_options) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py",line 371,in execute output = self.handle(*args,**options) File "/usr/local/lib/python3.8/site-packages/django_jenkins/management/commands/jenkins.py",line 116,in handle coverage.save(tested_locations,options) File "/usr/local/lib/python3.8/site-packages/django_jenkins/tasks/with_coverage.py",line 29,in save self.coverage.stop() File "/usr/local/lib/python3.8/site-packages/django_jenkins/tasks/with_coverage.py",line 55,in get_morfs return [filename for filename in coverage.data.measured_files() AttributeError: 'Coverage' object has no attribute 'data' 被声明并构造为您班级的私有成员。当您尝试iss时,它已经存在-不允许这样做。您不想要Initialization,而是只想用iss{user_input}中的内容替换iss的内容。为此,您使用std::basic_istringstream::str。成员函数user_input允许您获取或设置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 */
}

其他提示,请看Why is “using namespace std;” considered bad practice?

仔细检查一下,如果还有其他问题,请告诉我。