重载运算符'>>'的使用不明确(操作数类型'istream'(又名"basic_istream<char>")和"MyIncreEx")

Use of overloaded operator '>>' is ambiguous (with operand types 'istream' (aka 'basic_istream<char>') and 'MyIncreEx')

本文关键字:gt istream basic MyIncreEx char lt 操作数 运算符 不明确 类型 重载      更新时间:2023-10-16

这是代码,我似乎找不到它的问题;我需要超载&lt;&lt;&gt;&gt;操作员,但我会收到以下错误:

使用超载运算符'&gt;''是模棱两可的(具有操作数类型'istream'(又称'basic_istream')和'myincreex')

我看不到什么真正模棱两可:

class MyIncreEx;
istream& operator>>(istream& is, MyIncreEx& s);
ostream& operator<<(ostream &os, MyIncreEx& s);
MyIncreEx operator++(MyIncreEx& d, int dummy);
MyIncreEx operator++(MyIncreEx& d);
class MyIncreEx
{
    friend istream& operator>>(istream& is, MyIncreEx s);
    friend ostream& operator<<(ostream& os, MyIncreEx s);
    friend MyIncreEx operator++(MyIncreEx& d, int dummy);
    friend MyIncreEx operator++(MyIncreEx& d); 
public:
    int num1 = 0, num2 = 0, num3 = 0;
};
istream& operator>>(istream& is, MyIncreEx& s)
{
    is >> s.num1;
    is >> s.num2;
    is >> s.num3;
    return is;
};
ostream& operator<<(ostream &os, MyIncreEx& s)
{
    os << "(" << s.num1 <<"," <<s.num2 << "," << s.num3 <<")"<< endl;
    return os;
};
MyIncreEx operator++(MyIncreEx& d)              
{
    d.num1++;
    d.num2++;
    d.num3++;
    return d;
};
MyIncreEx operator++(MyIncreEx& d, int dummy) 
{
    d.num1++;
    d.num2++;
    d.num3++;
    return d;
};
int main()
{
    MyIncreEx obj;
    cout << "please enter three numbers: ";
    cin  >> obj;
    
    cout << "The original value are: " << obj << endl;
    obj++;
    
    cout << "The new values after obj++ are: " <<  obj << endl;
    ++obj;
    
    cout << "The new values after ++obj are: " << obj << endl;
}

您声明了两个不同版本的输出运算符:

istream& operator>>(istream& is, MyIncreEx& s);
ostream& operator<<(ostream &os, MyIncreEx& s);
class MyIncreEx
{
    friend istream& operator>>(istream& is, MyIncreEx s);
    friend ostream& operator<<(ostream& os, MyIncreEx s);
    ...
};

friend操作员具有不同且相互冲突的签名。您可能想将它们声明为

    friend istream& operator>>(istream& is, MyIncreEx& s);
    friend ostream& operator<<(ostream& os, MyIncreEx const& s);

(假设您还将输出操作员修复到MyIncreEx const&而不是MyIncreEx&)。