【问题标题】:error: no match for ‘operator<<’ defining by ostream in c++错误:与 c++ 中 ostream 定义的“operator<<”不匹配
【发布时间】:2018-02-05 11:33:34
【问题描述】:

我想重载&lt;&lt; operator。这是我的代码:

#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <cmath>
#include <list>
using namespace std;

enum class Zustand{Neuwertig,Gut,Abgegriffen,Unbrauchbar};

class Exemplar{
private:
    int aufl_num;
    Zustand z;
    bool verliehen;

public:
    Exemplar(int aufl_num);
    Exemplar(int aufl_num,Zustand z);
    bool verfuegbar() const;
    bool entleihen();
    void retournieren(Zustand zust);
    friend ostream& operator<<(ostream& os, const Exemplar& Ex);
};

//Constructor 1;
Exemplar::Exemplar(int aufl_num):
    aufl_num{aufl_num},
    z{Zustand::Neuwertig},
    verliehen{false}
    {
        if(aufl_num >1000 || aufl_num <1) throw runtime_error("Enter correct number betwee 1 and 1000");

    }

// Constructor 2;
Exemplar::Exemplar(int aufl_num,Zustand z):
    aufl_num{aufl_num},
    z{z},
    verliehen{false}
    {
        if(aufl_num >1000 || aufl_num <1) throw runtime_error("Enter correct number betwee 1 and 1000");

    }


ostream& operator<<(ostream& os, const Exemplar& Ex){
    if(Ex.verliehen == true){
        os << "Auflage:" << Ex.aufl_num <<","<< "Zustand:"<<Ex.z<<","<<"verliehen";
    }else{
        os << "Auflage:" << Ex.aufl_num <<","<< "Zustand:"<<Ex.z;
    }

}

我将ostream&amp; operator&lt;&lt; 声明为友元函数,类和函数代码中的定义似乎相同。但我不知道,为什么编译器会抛出一个错误“错误:'operator

错误信息:

main.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Exemplar&)’:
main.cpp:72:53: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const Zustand’)
   os << "Auflage:" << Ex.aufl_num <<","<< "Zustand:"<<Ex.z<<","<<"verliehen";

【问题讨论】:

  • 请包含完整的错误信息,它会说明编译器试图用什么类型调用operator&lt;&lt;
  • minimal reproducible example,拜托。您显示的代码甚至没有尝试调用 operator&lt;&lt;。除此之外,请尝试删除不相关的细节(但保持代码可编译,只是您询问的错误)。
  • 我猜编译器在抱怨Zustand 类型缺少operator &lt;&lt;
  • 仔细查看您的错误信息。问题不在于您的Exemplar 类的&lt;&lt; 重载,而是没有为您的枚举类定义&lt;&lt; 重载。
  • 你不会错误地抱怨输出Ex.z,这是一个enum class吗?见stackoverflow.com/questions/11421432/…

标签: c++


【解决方案1】:

你的错误很简单。您尝试调用:os &lt;&lt; Ex.z,其中zZustand,而Zustand 没有为其实现ostream 运算符。您可能希望将 enum 的值打印为整数。编译器不知道如何打印出Zustand,所以你必须告诉它如何打印。

【讨论】:

  • 但是为了打印一个单词(而不是整数),我应该为枚举类重载
  • 是的,你必须这样做。但是,您必须为每个枚举值获取一个对应的字符串,因为无法转换它。
  • @Rob_Fir 是的。 names "Neuwertig, Gut, Abgegriffen, Unbrauchbar" 不会在您的程序中出现作为字符串,您必须在somewhere中有一些具有这些值的字符串> 如果你想要他们
  • @Rob_Fir 如果您有多个枚举,您希望将名称的文本与每个值相关联,have a look here 用于实现
【解决方案2】:

改变

os << "Auflage:" << Ex.aufl_num <<","<< "Zustand:"<<Ex.z<<","<<"verliehen";

进入

os << "Auflage:" << Ex.aufl_num <<","<< "Zustand:"
   << static_cast<std::underlying_type<Zustand>::type>(Ex.z) 
   <<","<<"verliehen";

第二行也是如此。

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 2013-07-31
    • 1970-01-01
    • 2011-10-06
    • 2011-12-08
    • 2020-08-18
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多