cin中的模糊过载>>操作者

时间:2011-09-05 16:58:28

标签: c++ operators iostream

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

  

运营商'运营商的模糊运算符>>'在'std :: cin>> C1'。

声明: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>

3 个答案:

答案 0 :(得分:8)

ComplexNumber C1();

这不符合你的想法。

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

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

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

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

Type name();                      // (3)

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

这个“问题”被称为“Most Vexing Parse”。

相反,写一下:

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

我还建议:

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

答案 1 :(得分:2)

ComplexNumber C1();

声明一个函数C1(),它不带参数并返回ComplexNumber

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

答案 2 :(得分:2)

本声明:

ComplexNumber C1();

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

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