辛>>运算符中的模棱两可的过载

Ambiguous Overload in cin>> operator

本文关键字:gt 模棱两可 运算符      更新时间:2023-10-16

由于某种原因,我得到一个错误:

"std::cin>>C1"中运算符"operator>>"的运算符不明确。

声明:ComplexNumber.h

ostream & operator<<(ostream & out, const ComplexNumber & n);
istream & operator>>(istream & in, ComplexNumber & n);

实现:ComplexNumber.cpp

ostream& operator << (ostream & out, const ComplexNumber & n)
{
    n.print(out);
    return out;
}
istream& operator >> (istream & in, ComplexNumber & n)
{
    char c1[10];
    cout<<("Enter complex number: ");
    in>>c1;
    double a,b;
    a=c1[0]-'0';
    b=c1[2]-'0';
    ComplexNumber answer(a,b);
    n=answer;
    return in;
}

main.cpp

int main()
{
    ComplexNumber C1();
    cin>>C1;
    return 0;
}

编译器错误

candidates are: 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>
ComplexNumber C1();

这并不像你想象的那样。

具有自动存储持续时间的对象的声明通常采用以下两种形式之一:

Type name(constructor-arguments); // (1)
Type name;                        // (2)

请注意,第二种形式的没有有一组空括号(()(。

这是因为C++的一个怪癖是,下面声明了一个名为name的函数,该函数返回Type类型的对象:

Type name();                      // (3)

现在,您没有告诉我们编译器的诊断输出中列出的候选重载是什么,但很明显,您声明的函数name可以转换为多个目标类型,从而导致"模糊重载"错误;不管怎样,没有一个候选人是你真正想要的。

这个"问题"被称为"最Vexing解析"。

相反,写:

int main() {
   ComplexNumber C1;
   cin >> C1;
}

我还推荐:

  • 缩进代码以使其清晰易读
  • 使用std::string而不是C样式字符串

此语句:

ComplexNumber C1();

不会创建ComplexNumber的实例。相反,它声明了一个名为C1的函数,该函数不接受任何参数,并返回一个ComplexNumber

请参阅http://en.wikipedia.org/wiki/Most_vexing_parse.

ComplexNumber C1();

声明了一个不带参数的函数CCD_ 9并返回一个CCD_。

这在C++中被称为Most Vexing Parse