【问题标题】:Error while Overloading the '>>' operator重载“>>”运算符时出错
【发布时间】:2012-03-25 10:56:41
【问题描述】:

我正在为一个项目设计一个 Money 对象。我不是在寻求实施方面的帮助,因为我真的必须自己弄清楚,但我收到以下错误(这是唯一的错误!)

错误 C2678: 二进制 '>>' : 未找到采用 'std::istream' 类型的左侧操作数的运算符(或没有可接受的转换)

我的 Money.h 或 Money.cpp 文件中没有错误,只有 test.cpp 文件。以下是所有三个文件的内容:

钱.h

#ifndef MONEY_H
#define MONEY_H
#include <iostream>
#include <string>
class Money
{
public:
    Money( );
    Money( int dollars, int cents );

    friend std::istream& operator>>( std::istream &i, Money &m );

private:
    int dollars;
    int cents;
};
#endif

Money.cpp

#include "Money.h"

Money::Money(void) : dollars(0), cents(0)
{

}

Money::Money( int dollars, int cents ) : dollars(dollars), cents(cents)
{

}

std::istream& operator>>( std::istream &i, Money &m )
{

    int d;
    int c;
    char input;
    std::string dollars = "";
    std::string cents = "";

    input = std::cin.peek();
    while (std::cin.peek() != '.')
    {
        if ( !( (input >= '0') && (input <= '9') ) )
        {
            std::cin.ignore();
        }
        else
        {
            input = std::cin.get();
        }

        dollars += input;
    }

    if ( std::cin.peek() == '.')
    {
        std::cin.ignore();
    }

    std::cin >> cents;

    d = atoi(dollars.c_str());
    c = atoi(cents.c_str());

    m = Money(d, c);

    return i;
}

最后是test.cpp:

#include "Money.h"

int main()
{
    Money newMoney();
    std::cout << "Enter a money object!" << std::endl;
    std::cin >> newMoney;
}

所以,你有它。我很确定这是我能做到的。

【问题讨论】:

  • 与其在 google 上闲逛,不如试试这个:将您的程序缩减为仍然显示错误的最小程序。要么你会在这个过程中发现错误,要么你有一个有用的测试用例要发布到 StackOverflow。 sscce.org
  • 你声明std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Money&amp; m)你的测试代码可以看到吗?
  • 我的 Money.h 文件中现在有friend std::istream&amp; operator&gt;&gt;( std::istream &amp;i, Money &amp;m );,函数在实现文件中定义。我仍然有同样的错误。

标签: c++ visual-c++ operator-overloading istream


【解决方案1】:

您的问题中没有足够的数据。但是,参考我的水晶球,我发现您在 .CPP 文件中定义 operator&gt;&gt;,但未能在您的 .H 文件中声明 operator&gt;&gt;

将以下行添加到您的 .H:

std::istream& operator>>( std::istream &i, Money &m );

我的水晶球有问题。错误就在这里:

Money newMoney();

这并没有声明一个名为 newMoneyMoney 对象。这声明了一个名为 newMoney 的外部函数,它不接受任何参数并返回一个 Money 对象。将该行替换为:

Money newMoney;

【讨论】:

  • 我实现了你和 nate_weldon 的答案,并且我已经粘贴了我的代码。
  • @Tasuret - 如果您在第一次提出问题时发布了剥离的代码,您会很快收到正确的答案。
  • 哎呀,我是个白痴。在学习了 3 年 Java 之后,我需要练习我的 C++。
【解决方案2】:

除了通常我会定义这个之外,什么都不会弹出

std::istream& operator>>

作为

friend std::istream& operator>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2016-09-25
    • 2014-04-24
    • 2021-10-29
    • 2016-03-17
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多