重载操作符 - C++c重载出错

 每天洗脸的小媳妇_853 发布于 2022-11-06 12:59

我写了个Book的类
一开始如下:

class Book {
public:
Book(string name,string author,string pub,string isbn, int remain, int borrowed):_bookName(name),_bookAuthor(author),_bookPub(pub),_bookISBN(isbn),_bookRemain(remain),_bookBorrowed(borrowed){}

//...中间省略
}
ofstream& operator<<(ofstream& out, const Book& book){
     out << book._bookName << ',' << book._bookAuthor << ',' << book._bookISBN << ',' << book._bookPub << ',' << book._bookRemain << ',' << book._bookBorrowed << '\n';
     return out;
}

一开始这个<<操作符是可以用的。
然后我往里面多加了一个构造函数,代码如下

class Book {
public:
Book(string name,string author,string pub,string isbn, int remain, int borrowed):_bookName(name),_bookAuthor(author),_bookPub(pub),_bookISBN(isbn),_bookRemain(remain),_bookBorrowed(borrowed){}
     
Book(string isbn){
     _bookAuthor = "";
     _bookName = "";
     _bookISBN = isbn;
     _bookPub = "";
     _bookRemain = 0;
     _bookBorrowed = 0;

}
//..
}

加上一个构造后,就开始报错:

./Book.h:79:10: error: use of overloaded operator '<<' is ambiguous (with operand types 'ofstream' (aka 'basic_ofstream') and 'const string'
      (aka 'const basic_string'))
     out << book._bookName << ',' << book._bookAuthor << ',' << book._bookISBN << ',' << book._bookPub << ',' << book._bookRemain << ',' << book._bookBorrowed << '\n';
     ~~~ ^  ~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/basic_string.h:2749:5: note: candidate function [with _CharT = char, _Traits =
      std::char_traits, _Alloc = std::allocator]
    operator<<(basic_ostream<_CharT, _Traits>& __os,

我google了一下错误,找到了这个帖子http://stackoverflow.com/questions/33...
但是依旧不懂,怎么出现的冲突?我没有用模板什么的。
然后我,尝试放入一个没有参数的构造函数:

Book(){
     _bookAuthor = "";
     _bookName = "";
     _bookISBN = "";
     _bookPub = "";
     _bookRemain = 0;
     _bookBorrowed = 0;

}

编译通过了。
这是为什么阿?

2 个回答
  • 这是单参数构造函数带来的隐式转换问题,详细可以参考scott mayer的《More effective C++》
    有两种函数允许编译器进行这些的转换:单参数构造函数(single-argument constructors)和隐式类型转换运算符。解决方法是提供一个默认构造函数或者加上explicit关键字.

    2022-11-12 01:53 回答
  • 是编译器自动转换在作怪。

    operator<<的第二个参数可以是string,你写了一个constructor可以把string转换成Book,同时Book也可以作为operator<<的第二个参数(即你写的那个函数),所以编译器不知道是直接调用string的那个版本,还是把string转换成Book然后调用book的版本。

    建议把

    Book(string isbn)

    改成

    explicit Book(string isbn)

    关闭自动转换

    2022-11-12 01:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有