没有运算符 << 匹配这些操作数

Posted

技术标签:

【中文标题】没有运算符 << 匹配这些操作数【英文标题】:No operator << matches these operands 【发布时间】:2014-02-24 19:23:29 【问题描述】:

关于我遇到的这个错误,我已经在这里阅读了一两个小时的问题,其中大多数人忘记了#include 字符串(我已经完成了),或者重载了

这是有问题的代码:

void Student::getCoursesEnrolled(const vector<Course>& c)

    for (int i = 0; i < c.size(); i++)
    
        cout << c[i] << endl;
    


我得到的错误是:

Error: No operator matches these operands
    operand types are: std::ostream << const Course

我要做的就是返回向量。我读过关于重载

感谢您的宝贵时间!

【问题讨论】:

cout Course 的每个成员分别。 【参考方案1】:

我要做的就是返回向量。

不完全;您正在尝试使用cout打印它。而cout 不知道如何打印Course 对象,除非您提供重载的operator&lt;&lt; 来告诉它如何打印:

std::ostream& operator<<(std::ostream& out, const Course& course)

    out << course.getName(); // for example
    return out;

在 *** 上查看 the operator overloading bible 了解更多信息。

【讨论】:

【参考方案2】:

问题是运算符 Course 类型的对象来说不是重载

cout << c[i] << endl;

你需要重载这个操作符或者编写你自己的函数来在std::ostream中输出一个Course类型的对象

例如假设下面是类Course的定义

class Course

private:
   std::string name;
   unsigned int duration;
public:
   Course() : duration( 0 ) 
   Course( const std::string &s, unsigned int n ) : name( s ), duration( n ) 
   std::ostream & out( std::ostream &os ) const
   
      return ( os << "Course name = " << name << ", course duration = " << duration );
   
;

什么时候可以写

std::vector<Course> v =   "A", 1 ,  "B", 2 ,  "C", 3  ;

for ( const Course &c : v ) c.out( std::cout ) << std::endl;

你可以重载运算符

class Course

private:
   std::string name;
   unsigned int duration;
public:
   Course() : duration( 0 ) 
   Course( const std::string &s, unsigned int n ) : name( s ), duration( n ) 
   friend std::ostream & operator <<( std::ostream &os, const Course & c )
   
      return ( os << "Course name = " << c.name << ", course duration = " << c.duration );
   
;

并将其用作

std::vector<Course> v =   "A", 1 ,  "B", 2 ,  "C", 3  ;

for ( const Course &c : v ) std::cout << c << std::endl;

【讨论】:

【参考方案3】:

流操作符&lt;&lt; 用于“输出”该对象的某些表示。如果您不想重载运算符但只需选择一些属性来输出:

for (int i = 0; i < c.size(); i++)

    cout << c[i].Name << endl;  // assuming Name is a property of Course

当您重载运算符时,您只需决定Course 的正确表示是什么:

ostream& operator<< (ostream &out, Course &c)

    out << c.Name "(" << c.Description << ")";
    return out;

【讨论】:

【参考方案4】:

你的Course 类需要实现一个操作符:

class Course

public:
    /* 
     * Your code here
     */

   // Probably missing this:
   friend std::ostream& operator << (std::ostream& os, const Course& course)
   
      os << course.name(); // etc..
      return os;
   ;
; // eo class Course

【讨论】:

【参考方案5】:

由于您还没有学会重载operator&lt;&lt;,因此您可以做的是打印Course 类的每个成员。您还没有发布Course 的定义,但可能是这样的:

class Course

public:
    int get_number()  return _number; 
    const std::string& get_name()  return _name; 

private:
    int _number;
    std::string _name;
;

那么你可以说:

void Student::getCoursesEnrolled(const vector<Course>& c)

    for (int i = 0; i < c.size(); i++)
    
        cout << c[i].get_number() << " "
             << c[i].get_name() << std::endl;
    

【讨论】:

【参考方案6】:

你的问题是这个特定的部分:

cout &lt;&lt; c[i]

在您的情况下,c[i]Course 类型的对象,正如 dvnrrs 正确指出的那样。所以要么:

    为您的对象实现重载的 如果您的 Course 对象在某种程度上是原始类型的 typedef,请尝试将其显式转换为字符串类型(或类似类型)

【讨论】:

以上是关于没有运算符 << 匹配这些操作数的主要内容,如果未能解决你的问题,请参考以下文章

没有运算符 << 匹配这些操作数

没有运算符匹配这些操作数

对象向量 - C++。没有运算符“<<”与这些操作数匹配,错误

“没有运算符 >> 匹配这些操作数”

没有运算符“=”匹配这些操作数错误

Visual Studio 手表中的向量“无运算符“[]”与这些操作数匹配错误