【问题标题】:Properly overload << operator正确重载 << 运算符
【发布时间】:2021-05-05 11:46:15
【问题描述】:

我对 c++ 很陌生,我目前的问题是使用重载运算符输出 struct。 我已经尽力了,但显然还不够。任何人都知道为什么我的编译器不断推出这个错误: \main.cpp|16|error: no match for 'operator

这是对应的代码:

#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;
}

我很确定我在此之前定义了运算符

还是先谢谢大家的回答

【问题讨论】:

  • 您没有为您的enum Eyecolor 定义operator&lt;&lt;
  • 例如究竟是什么错误。 (operand types are 'std::basic_ostream' and 'const Eyecolor')。您在PSStruct 上定义了您的运算符。但是您的枚举是类类型。如果你想让&lt;&lt; ps.eyecolor 工作,它需要自己的运算符。
  • 好吧,正如 WhozCraig 所说,或者您可以进行切换(或如果)而不是“godbolt.org/z/TEf8bds8v
  • @MathiasJ; 1)你的例子被打破了。 2) 不好的建议。
  • @user1810087 是的,因为给出的示例代码被破坏了?该问题与特定的编译器错误有关,此代码修复了该编译器错误。它没有解决“void print(){ cout

标签: c++ operator-keyword


【解决方案1】:

错误消息的精简版:

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

该错误抱怨缺少operator&lt;&lt; for Eyecolor。您定义的那个是 PStruct 并尝试在此处调用缺少的运算符:

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

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

枚举到字符串的转换在 C++ 中是一个长期存在的烦恼,您可以在这里看到一个通用解决方案需要投入多少工作:enum to string in modern C++11 / C++14 / C++17 and future C++20。在这里我不打算讨论,而只是展示如何让operator&lt;&lt; 工作。

真的没有冒犯,但让接线员成为朋友闻起来像Cargo Cult Programming。您可能已经在示例中看到了这一点,并且通常需要与操作员交朋友,但在您的代码中没有理由这样做。而且print()有错误。

固定版本可能如下所示:

#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: Why is “using namespace std;” considered bad practice?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多