将 istream 运算符与类交朋友

friending istream operator with class

本文关键字:交朋友 运算符 istream      更新时间:2023-10-16

您好,我正在尝试将我的运算符>>重载到我的类中,但我发现 Eclipse 中出现错误。

法典:

    friend istream& operator>>(const istream& is, const RAngle& ra){
    return is >> ra.x >> ra.y;
}

代码 2:

    friend istream& operator>>(const istream& is, const RAngle& ra)
{
    is >> ra.x;
    is >> ra.y;
    return is 
}

都崩溃了,我不知道为什么,请帮忙。

编辑:

ra.x & ra.y 都是我班的 2 个私人 int;

完全错误:

错误:

   ../rightangle.h: In function 'std::istream& operator>>(std::istream&, const RAngle&)':
../rightangle.h:65:12: error: ambiguous overload for 'operator>>' in 'is >> ra.RAngle::x'
../rightangle.h:65:12: note: candidates are:
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:122:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:122:7: note:   no known conversion for argument 1 from 'const int' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}'
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:126:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:126:7: note:   no known conversion for argument 1 from 'const int' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}'
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:133:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:133:7: note:   no known conversion for argument 1 from 'const int' to 'std::ios_base& (*)(std::ios_base&)'
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:241:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:241:7: note:   no known conversion for argument 1 from 'const int' to 'std::basic_istream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}'
../rightangle.h:66:12: error: ambiguous overload for 'operator>>' in 'is >> ra.RAngle::y'
../rightangle.h:66:12: note: candidates are:
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:122:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:122:7: note:   no known conversion for argument 1 from 'const int' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}'
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:126:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:126:7: note:   no known conversion for argument 1 from 'const int' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}'
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:133:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:133:7: note:   no known conversion for argument 1 from 'const int' to 'std::ios_base& (*)(std::ios_base&)'
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:241:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>] <near match>
c:mingwbin../lib/gcc/mingw32/4.6.1/include/c++/istream:241:7: note:   no known conversion for argument 1 from 'const int' to 'std::basic_istream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}''

由于operator>>要修改你传递给它的参数,所以它们不能是对 const 的引用,所以你想要的是这样的:

friend std::istream &operator>>(std::istream &is, RAngle &ra) { 
    return is >> ra.x >> ra.y;
}

请注意,几乎所有 I/O 操作也会(至少潜在地)更改流的状态,因此您(几乎?)总是希望通过非常量引用传递流参数。

一个问题是运算符的签名:

friend istream& operator>>(const istream& is, const RAngle& ra){
//                         ^^^^^              ^^^^^
    return is >> ra.x >> ra.y;
}

如果参数const您将无法修改它们。截至错误消息,它们似乎表明编译器未能为is >> ra.xis >> ra.y找到适当的重载。这可能与上一个问题(找不到采用 const-lvalue 的重载)有关,也可能与上一个问题有关,具体取决于ra.xra.y的类型(问题中未显示)。

请从参数"const RAngle& ra"中删除const。不能修改方法中的常量引用。