cin >> operator中的模糊过载

1 c++ iostream operators

出于某种原因,我收到一个错误:

'std :: cin >> C1'中运算符'operator >>'的模糊运算符.

声明:ComplexNumber.h

ostream & operator<<(ostream & out, const ComplexNumber & n);
istream & operator>>(istream & in, ComplexNumber & n);
Run Code Online (Sandbox Code Playgroud)

实现: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;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

int main()
{
    ComplexNumber C1();
    cin>>C1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器错误

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>
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 8

ComplexNumber C1();
Run Code Online (Sandbox Code Playgroud)

这不符合你的想法.

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

Type name(constructor-arguments); // (1)
Type name;                        // (2)
Run Code Online (Sandbox Code Playgroud)

需要注意的是第二种形式并不能有一个空括号(()).

那是因为C++的一个怪癖是以下声明一个被调用的函数name返回一个类型的对象Type:

Type name();                      // (3)
Run Code Online (Sandbox Code Playgroud)

现在,您没有告诉我们编译器的诊断输出列出的候选重载是什么,但显然您声明的函数name可以转换为多个目标类型,从而导致"模糊过载"错误; 无论如何,没有一个候选人实际上是你的意思.

这个"问题"被称为" 令人烦恼的解析 ".

相反,写:

int main() {
   ComplexNumber C1;
   cin >> C1;
}
Run Code Online (Sandbox Code Playgroud)

我还建议:

  • 缩进代码以使其清晰可读;
  • 使用std::string而不是C风格的字符串.