【问题标题】:Why am i getting error when i try to assign string to istringstream object in visual studio in c++?当我尝试在 c++ 中的 Visual Studio 中将字符串分配给 istringstream 对象时,为什么会出现错误?
【发布时间】:2020-09-13 04:37:27
【问题描述】:

以下类将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;
    
}

【问题讨论】:

  • x{y} 不是 C++ 语法中的有效表达式

标签: c++ istringstream


【解决方案1】:

简短的版本是你不能初始化一个对象两次。 iss 被声明并构造为你的类的私有成员。当您尝试iss{user_input} 时,它已经存在——这是不允许的。您不想要Initialization,而是只想将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

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

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

【讨论】:

  • 非常感谢!解释得很漂亮。和很好的例子!非常感谢!
  • 很高兴它有帮助 - 祝你编码好运!
【解决方案2】:
    iss{user_input};  //THIS IS WHERE I GET THE ERROR

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

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

【讨论】:

  • 请您解释一下。我不明白答案
  • @PratapBiswakarma 错误行的语法无效(与 this 无法编译的原因相同)。从上下文来看,我假设您想要(重新)设置iss 以使用新的user_input 字符串,该字符串转换为clear + str
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
相关资源
最近更新 更多