我对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;"被认为是不好的做法?