辛>>运算符中的模棱两可的过载
Ambiguous Overload in cin>> operator
由于某种原因,我得到一个错误:
"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。
相关文章:
- EASTL矢量<向量<int>>连续的
- "Inverse SFINAE"避免模棱两可的过载
- 操作员C++的模棱两可的过载
- 模棱两可的重载模板
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 模棱两可的 != reverse_iterator运算符
- SFINAE不能防止模棱两可的操作员过载吗?
- VSCode 说 std::chrono 是模棱两可的,如果运算符<<重载
- 为什么对模板的调用不模棱两可?
- 修复重载运算符的使用'+'模棱两可?
- 为什么同时覆盖全局新运算符和特定于类的运算符不是模棱两可的行为?
- Antlr4 C++访问模棱两可的分支
- 模棱两可的调用 - 模板化函数
- 在SESHAT中,对"元组"的引用是模棱两可的
- C++17 年与 Clang 的模棱两可的部分专业化
- gcc 中的模棱两可的运算符
- 将 NULL 转换为长不是模棱两可吗?
- C++ lambda 模棱两可的调用
- 带有模板的循环缓冲区在Keil MDK5上是模棱两可的错误?
- C++11 中对超载'ref(Select::Expressions::Code&)'的调用模棱两可