重载">>"时遇到的错误error C2679

代码如下:

//Money.h 文件 

#ifndef Money_H
#define Money_H
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
namespace Moneysavitch
{

 class Money
 {
 public:
  Money();
  Money(long d);
  Money(long d,long c);
  friend Money operator +(const Money& m1,const Money& m2);
 // friend Money operator -(const Money& m);
  friend Money operator -(const Money& m1,const Money& m2);
  friend bool operator ==(const Money& m1,const Money& m2);
        friend istream& operator >>(Money& m,istream &ins);
        friend ostream& operator <<(Money& m,ostream &ous);
  void set_value();
 private:
  long dollars;
  long cents;
 };
 void get_stream(ifstream& ins,ofstream& ous);
}
#endif

 

//Money类的实现文件:Money.cpp

#ifndef Money_cpp
#define Money_cpp
#include<iostream>
#include<stdlib.h>
#include"Money.h"
#include"Money.cpp"
#define TRUE 1
#define FALSE 0
using namespace std;
namespace Moneysavitch
{
 Money::Money():dollars(0),cents(0)
 {}
 Money::Money(long d)
 {
  dollars=d;
  cents=0;
 }
 Money::Money(long d,long c)
 {
  dollars=d;
  cents=c;
 }
 void Money::set_value() 
    {  
  cout<<"Enter dollars:/n";
  cin>>dollars;
  cout<<"Enter cents:/n";
  cin>>cents;
 }
 Money operator +(const Money& m1,const Money& m2)
 {
  Money temp;
  temp.cents=m1.cents+m2.cents;
  if(temp.cents>=100)
  {
   temp.cents=-100;
   temp.dollars=m1.dollars+m2.dollars+1;
  }
  else
  {
   temp.dollars=m1.dollars+m2.dollars;
  }
  return temp;
 }

   Money operator -(const Money& m1,const Money& m2)
   { 
   long temp;
   Money m_temp;
         if((m1.dollars*100+m1.cents)>=(m2.dollars*100+m2.cents))
   {
             temp=(m1.dollars*100+m1.cents)+(m2.dollars+100+m2.cents);
    m_temp.dollars=temp/100;
    m_temp.cents=temp-m_temp.dollars*100;
   }
   else
   {
            cout<<"error!The result is negative.";
   exit(1);

   }
   return m_temp;
   }
  bool operator ==(const Money& m1,const Money& m2)
  {
           if((m1.dollars==m2.dollars)&&(m2.cents==m2.cents))
      return TRUE;
     else
      return FALSE;
  }

   istream& operator >>(Money& m,istream &ins)
   {
    ins>>m.dollars;
    ins>>m.cents;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    return ins;
   }
   ostream& operator <<(Money& m,ostream &ous)
   {
    ous<<"$"<<m.dollars;
    ous<<"."<<m.cents<<endl;
       return ous;
   }
void get_stream(ifstream& ins,ofstream& ous)
   {
       ins.open("infile.txt");
    if(ins.fail())
    {
     cout<<"Failed to open the output file./n";
        exit(1);
    }
    ous.open("outfile.txt");
    if(ous.fail())
       {
     cout<<"Failed to open the output file./n";
     exit(1);
    }
 }

}

#endif

 

//入口函数main.cpp

 #include"Money.h"
#include"Money.cpp"
#include<iostream>
using namespace std;
using namespace Moneysavitch;
int main()
{
 Money m1,sum_m,div_m,m3;
 m1.set_value();
 Money m2(100,5);
 sum_m=m1+m2;
 div_m=m1-m2;
 fstream ins;
 ofstream ous;
 get_stream(ins,ous);
 ns>>m3;
 ous<<m3;
 return 0;
}

调试环境vc6.0sp6.调试报错如下:

--------------------Configuration: Money - Win32 Debug--------------------
Compiling...
main.cpp
G:/code/Money/main.cpp(16) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Moneysavitch::Money' (or there is no acceptable conversion)
G:/code/Money/main.cpp(17) : error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class Moneysavitch::Money' (or there is no acceptable conversion)
Error executing cl.exe.

问题解决:

friend istream& operator >>(Money& m,istream &ins);中的形参顺序不对.

修改为friend istream& operator >>(istream &ins,Money& m);即可!

问题扩展:有时导致error C2679: binary '<<错误可能是#inlcude<iostream>和#include<iostream.h>的原因

其实没有< iostream.h >这样的东西 --- 标准化委员会在简化非C标准头文件时用< iostream > 取代了它。

但又没有完全取消< iostream.h >的使用,并且很多编译器都同时支持< iostream >和< iostream.h >,造成

现在的局面.#include < iostream >,得到的是置于名字空间std下的iostream库的元素;如果使用

#include < iostream.h >,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,

而设计名字空间的初衷正是用来避免这种名字冲突的发生.为了避免类名函数名的冲突问题,引入了名字空间std,

但无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,例如,声明在< iostream.h >和< complex.h >等

头文件中的功能。现有软件没有针对使用名字空间而进行相应的设计或者升级,如果用std来包装标准库导致现有

代码不能使用, 程序员是不会同意的。 标准化委员会为了拉拢人心,吸引更多的人入会,决定为包装了std的那部

分标准库构建新的头文件名。将现有C++头文件名中的.h去掉,所以就出现了< iostream.h>和< iostream >等

很多双胞胎。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值