C++c重载出错
我写了个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<char>') and 'const string' (aka 'const basic_string<char>')) 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<char>, _Alloc = std::allocator<char>] operator<<(basic_ostream<_CharT, _Traits>& __os,
我google了一下错误,找到了这个帖子http://stackoverflow.com/questions/33...
但是依旧不懂,怎么出现的冲突?我没有用模板什么的。
然后我,尝试放入一个没有参数的构造函数:
Book(){ _bookAuthor = ""; _bookName = ""; _bookISBN = ""; _bookPub = ""; _bookRemain = 0; _bookBorrowed = 0; }
编译通过了。
这是为什么阿?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是编译器自动转换在作怪。
operator<<的第二个参数可以是string,你写了一个constructor可以把string转换成Book,同时Book也可以作为operator<<的第二个参数(即你写的那个函数),所以编译器不知道是直接调用string的那个版本,还是把string转换成Book然后调用book的版本。
建议把
改成
关闭自动转换
这是单参数构造函数带来的隐式转换问题,详细可以参考scott mayer的《More effective C++》
有两种函数允许编译器进行这些的转换:单参数构造函数(single-argument constructors)和隐式类型转换运算符。解决方法是提供一个默认构造函数或者加上explicit关键字.