【问题标题】:C++: getline not part of argument listC ++:getline不是参数列表的一部分
【发布时间】:2012-11-20 14:14:48
【问题描述】:

我对 C++ 还很陌生,如果我的问题不够具体,请见谅。来了。

我正在尝试为我称为“书”的类重载>> 运算符。 “Book”包含“title”、“author”和“publisher”字符串对象、“student count”int 和“price”双变量。我的部分任务是从提供的 .txt 文件中获取这些值,并将值加载到它们相应的变量/对象中。所有值都在 .txt 文件中各自的行中,并且它们都遵循以下格式:

 //标题、作者、出版商、价格

从 Java 开始
加迪斯
斯科特/琼斯
105.99

我尝试使用getline() 获取字符串值(我在将价格翻倍后使用临时字符串),但是当我输入它时,Visual Studio 会说:

错误:重载函数“getline”的实例与参数列表不匹配。

我不明白这一点。我将<iostream><string> 都包括在内,我相信它们都是getline 工作所必需的。在转到主代码之前,我正在努力获取类文件,所以对于没有要发布的主代码,我深表歉意。这是课本的 .cpp 文件:

#include <iostream>
#include <string>
#include "book.h"

using namespace std;

book::book()
{
}

book::~book()
{
}

istream& operator>> (istream &in, book &bookInfo) {
    string temp;
    getline(in, bookInfo.title);
    return in;
}

下面有第 1 个问题...

假设我可以让getline 工作,我还有另一个问题。 Visual Studio 说 bookInfo.title 是不可访问的,即使这是该类的随附 .cpp 文件。我什至将istream&amp; 函数列为类本身的友元函数:

#include <iostream>
#include <string>

class book {
    friend istream& operator>> (istream&, book&);

public:
    book();
    virtual ~book();

private:
    string title;
    string author;
    string publisher;
    double price;
};

应该注意的是,我对另一个类使用了几乎相同的语法,并且没有收到错误消息。

感谢您的快速回复。

【问题讨论】:

  • "感谢您的快速回复。"我喜欢它:)
  • book.title 是私有成员 - 您无法在图书类之外访问它
  • @StevieG:他已将istream&amp; operator&gt;&gt; (istream&amp;, book&amp;); 声明为friend
  • 只是让运营商成为会员?您的第二个问题可能是第一个问题的原因..
  • 在没有朋友说明的情况下给我一条错误消息。关于“参数过多”的问题

标签: c++ getline


【解决方案1】:

在您的标题中,您没有使用std::。修复:

class book
{

    friend std::istream& operator>> (std::istream&, book&);

public:

    book();

    virtual ~book();

private:

    std::string title;
    std::string author;
    std::string publisher;
    double price;

};

【讨论】:

  • “使用命名空间标准”是否涵盖了这一点?\
  • 除了我没有那个,,,
  • @Will:不在头文件中。但是,它在源文件中确实如此。如果您将using namespace std; 放在您的标题中,它会覆盖它,但这是一种可怕 的做法。切勿将全局 using namespace ...; 放在标题中;所以你必须在标题中加上 std:: 前缀。
  • 我会记住可怕的做法。这是一个作业,我猜教授还没有让我们停下来。为什么它真的很可怕?
  • @Will:这里有一些不错的读物:"using namespace" in c++ headersWhy is 'using namespace std;' considered a bad practice in C++?。阅读这些内容后,如果不清楚,请随时询问。
【解决方案2】:

getline 是 std::istream 类的一个方法,见here:

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

你应该在类实例上调用它,例如

your_input_stream.getline( your_params ... )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2018-10-11
    相关资源
    最近更新 更多