【问题标题】:no instance of overloaded function "getline" matches the argument list -- argument types are: (std::ifstream,char)没有重载函数“getline”的实例与参数列表匹配——参数类型为:(std::ifstream,char)
【发布时间】:2020-04-15 03:20:02
【问题描述】:

这里是 C++ 初学者 我试图从文件中提取行并将其放入字符串数组中。该文件的每个单词都在其自己的行中。每当我测试数组时,它似乎都会将每个字母加载到数组中。所以它是字符而不是每个单词作为字符串。每个文件中的第一件事是一个数字,它将是数组大小。我应该动态分配我相信我做对的数组。 欢迎任何帮助。 我正在使用 VScode,getline 给我的问题是,没有重载函数“getline”的实例与参数列表匹配——参数类型是:(std::ifstream,char)。

   #include <iostream>
   #include <fstream>
   #include <string>

   using namespace std;

   int showMenuGetChoice();
   string createStringArray(int);
   void getInfoFromUser(string, string, int);
   void printStory(int, string, int);

   // Calls all the other functions to make a working Madlibs game. 
 int main ()
 {
    int UserChoice;

    ifstream QuestionFile;
    int arraySize;
    string Question;
    int test = 0;
    do {

    cout <<"Let's Play some Madlibs!!" << endl << endl;
    UserChoice=showMenuGetChoice();

    if (UserChoice == 1)
    {
        ifstream QuestionFile;
        QuestionFile.open("starWars.txt");
        QuestionFile >> arraySize;
        cin.ignore();

        string QuestionArray=createStringArray(arraySize);

        if(QuestionFile.is_open())
        {
            QuestionArray[arraySize];

            for(int i=0; i < arraySize; i++)
            {
                getline(QuestionFile, QuestionArray[i]);
            }
        }
        for(int i=0; i < arraySize; i++)
        {
            cout << QuestionArray[i] << endl;
        }

      }

// Takes in a integer and creates a array of that size. Dynamically allocates the array and returns a point to this array.
string createStringArray(int n)
{
    string*QuestionArray = new string[n];

    return *QuestionArray;
}

【问题讨论】:

  • 这里的所有问题都必须包含所有相关信息在问题本身中以纯文本形式。链接可以随时停止工作,使问题变得毫无意义。无法复制/粘贴以图像形式显示的代码、数据或错误;或编辑或编译以供进一步研究和调查。这个问题必须是edited,所有链接和图像都被删除并替换为所有相关信息,作为纯文本。所有代码必须满足minimal reproducible example 的所有要求。您可以在此处找到许多其他问题,以纯文本形式解释所有内容。这个也没有理由不能。
  • 我的问题还有什么需要解决的吗,或者编辑后的版本现在正确吗?

标签: c++ getline


【解决方案1】:

你得到了错误:

没有重载函数“getline”的实例与参数列表匹配 -- 参数类型是:(std::ifstream,char)。

因为您的“getline”调用有问题:

getline(QuestionFile, QuestionArray[i]);

std::getline 接受两个参数,一个std::istream 引用和一个std::string 引用。 QuestionFileistream,所以没关系,但是如果您查看 QuestionArray 的声明:

string QuestionArray=createStringArray(arraySize);

您应该注意到 QuestionArray 是一个 string 类型的变量。我不认为这是你想要的。您应该始终谨慎选择您在 C++ 中声明的变量类型,否则您将违背编译器试图为您提供的类型安全性。

字符串QuestionArrayith 元素是char,而不是string。这是编译器错误的原因。您正在尝试将该行放入单个字符元素而不是字符串中。

希望通过上述解释,提供的编译器消息现在会更有意义。它提供的信息相同,只是更简洁一些。

有了这些知识,让我们来处理createStringArray 函数:

string createStringArray(int n)
{
    string*QuestionArray = new string[n];

    return *QuestionArray;
}

您声明该函数返回单个字符串,而我希望您希望该函数返回一个字符串序列。返回字符串序列的正确方法是使用std::vector&lt;std::string&gt;,但如果您必须使用有风险的、过时的手动内存管理,则需要返回一个 pointer 到字符串,而不是从这个功能。有了这些知识,您应该能够更正这个函数、原始的 QuestionArray 变量类型,并且编译器错误应该会消失。

【讨论】:

  • 感谢您的回复,我应该为这个程序使用数组,所以我不能使用向量。如果我理解正确,它会尝试将字符放入 QuestionArray 的索引中,而不是放入整个单词。如果我不使用向量,我不完全理解我需要做的修复。
  • @Grima_Sovnig:您需要首先更正main()QuestionArray 的声明。它必须是指向字符串数组的指针,而不是字符串。出于同样的原因,createStringArray 的返回类型需要更正。在createStringArray 中,您需要非常仔细地检查您的语法。 return *QuestionArray 不返回指针。 * 在声明和表达式中意味着不同的东西。
  • 更多提示:string *QuestionArray = new string[n] 可能是正确的,它声明了一个“指向字符串数组的指针”....string QuestionArray=createStringArray(arraySize); 是错误的,您声明的是 string,但事实并非如此你想要什么......return *QuestionArray 错了,你想返回一个“指向字符串数组的指针”。 QuestionArray 是“指向字符串数组的指针”,但* 有什么作用?
猜你喜欢
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多