×××××sales_data通过类型转换形成的临时对象不能转换成sales_data &(非常量引用)

文件   sales_data.h

#include <iostream>
#include <string>
using namespace std;
struct sales_data{
public:
  sales_data();            
  sales_data(const std::string &s,unsigned n,double p); 
  sales_data(std::string &s);
  sales_data(istream &is);
  friend istream &read(istream &is,sales_data &s);
  friend ostream &print(ostream &os,sales_data &s);
  string isbn()const;
  sales_data &combine(sales_data &);
  double avg_price()const;
  ostream & dis(ostream & os)const;
private:
  std::string bookno;
  unsigned sales_cnt ;
  double revenue  ;

};

文件   function.cc

#include <iostream>
#include <string>
#include "sales_data.h"
using namespace std;
sales_data::sales_data():bookno(""),sales_cnt(0),revenue(0.0){cout << "call sales_data() " << endl;}
sales_data::sales_data(const std::string &s,unsigned n,double p):bookno(s),sales_cnt(n),revenue(n * p)
{cout << "call sales_data(std::string &s,unsigned n,double p) " << endl;}
sales_data::sales_data(std::string &s):sales_data(s,0,0){cout << "call 3" <<endl;}
sales_data::sales_data(istream & is):sales_data(){read(is,*this);cout << "call 4;" << endl;}

istream &read(istream &is,sales_data &s){
  double price;
  cout << "Enter BookNumber/Sales counts/Price: ";
  is >> s.bookno >> s.sales_cnt >> price;
  s.revenue = price * s.sales_cnt;
  return is;
}
ostream &print(ostream &os,sales_data &s){
  os << "\n    BookNumber: " << s.bookno;
  os <<"\n    Sales counts: " << s.sales_cnt;
  os << "\n    Sales revenue: " << s.revenue << endl;
}
//sales_data &add(sales_data &l,sales_data r){
//  combine(l,r);
//  return l;
//}
string sales_data::isbn()const{
  return  bookno;
}
sales_data & sales_data::combine(sales_data& s){
  if(sales_data::bookno != s.isbn())
    {cout << "WRONG!!! Their isbns are not equal!!!"  <<endl;}
  else{
    sales_cnt += s.sales_cnt;
    revenue += s.revenue;
  }
   return *this;
}

double sales_data::avg_price()const{
  if (sales_cnt == 0)
      return 0;
  else{
       return revenue/sales_cnt;
      }
  }
ostream & sales_data::dis(ostream &os)const{
  cout << "Book Number: " << bookno <<endl;
  cout << "Revenue: " << revenue <<endl;
  cout << "Sales counts: "<< sales_cnt << endl;
  return os;
}

sales_data & add(sales_data &l,sales_data &r){
  l.combine(r);
  return l;
}

文件 main.cc

#include <iostream>
#include <string>
#include "sales_data.h"
using namespace std;
int main()
{
  sales_data i;
  string s("12345");
  i.combine(s);                //立刻会报错
  print(cout,i);
 
  return 0;
}

g++编译器如下结果:

r@r-Sys:~/7.5.4/ex/2$ g++ function.cc main.cc -o 123
main.cc: In function ‘int main()’:
main.cc:9:14: error: cannot bind non-const lvalue reference of type ‘sales_data&’ to an rvalue of type ‘sales_data’
   i.combine(s);

这里错误原因是,main.cc中 s是一个string对象,执行 i.combine(s)时候,s通过转换构造函数隐式类型转换为临时量sales_data,但是这个临时量不能够转换为  combine的参数类型 sales_data &

发布了190 篇原创文章 · 获赞 107 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/digitalkee/article/details/105102049