适当过载<<操作员



我对c++还很陌生,目前的问题是使用重载运算符输出结构。我已经尽力了,但显然还不够。任何人都知道为什么我的编译器不断推出这个错误:\main.cpp|16|错误:"operator<lt;'(操作数类型为"std::basic_stream"one_answers"const-Eyecolor"(|

这是相应的代码:

#include <iostream>
#include <string>
using namespace std;
enum class Eyecolor {blue, brown, green};
struct PStruct {
string surname;
Eyecolor eyecolor;
double height;
bool gender;
friend std::ostream& operator<<(std::ostream& os, const PStruct& ps);
};
std::ostream& operator<<(std::ostream& os, const PStruct& ps)
{
os << ps.surname << '/' << ps.height << '/' << ps.gender << '/' << ps.eyecolor; //line 16
return os;
}
void print(){
cout << os;
}
int main()
{
return 0;
}

我很确定我定义了运算符<lt;在此之前的一行。

无论如何,感谢提前回答

错误消息的精简版本:

no match for 'operator<<' (operand types are 'std::ostream' and 'const Eyecolor')
----------------------------> ^^ 

该错误报告Eyecolor缺少operator<<。您定义的是PStruct,并试图调用此处缺少的运算符:

os << ps.surname << '/' << ps.height << '/' << ps.gender << '/' << ps.eyecolor;
--------------------> ^^

与为PStruct定义一个相同,您需要为EyeColor定义一个。

枚举到字符串的转换在C++中是一个长期存在的烦恼,你可以在这里看到要获得通用解决方案需要付出多少工作:现代C++11/C++14/C++17和未来C++20中的枚举到字符串。在这里,我不打算讨论这些,而只是展示如何使operator<<工作。

真的没有冒犯,但让操作员成为朋友闻起来像Cargo Cult编程。您可能已经在示例中看到过这种情况,并且通常需要与操作员交朋友,但在您的代码中没有这样做的理由。此外,CCD_ 7存在错误。

一个固定版本可能是这样的:

#include <iostream>
#include <string>
enum class Eyecolor {blue, brown, green};
struct PStruct {
std::string surname;
Eyecolor eyecolor;
double height;
bool gender;
};
std::ostream& operator<<(std::ostream& os, const Eyecolor ec){
switch(ec){
case Eyecolor::blue :
os << "blue";
break;
case Eyecolor::brown :
os << "brown";
break;
case Eyecolor::green :
os << "green";
break;
default:
os << "unknown color";
}
return os;
}
std::ostream& operator<<(std::ostream& os, const PStruct& ps)
{
os << ps.surname << '/' << ps.height << '/' << ps.gender << '/' << ps.eyecolor;
return os;
}
void print(const PStruct& ps){
std::cout << ps;
}

PS:为什么"使用命名空间std;"被认为是不好的做法?

最新更新