簡體   English   中英

沒有operator <<匹配這些操作數

[英]No operator << matches these operands

我一直在這里閱讀一兩個小時的問題關於我得到的這個錯誤,他們中的大多數都忘了#include string(我已經做過),或者重載<<運算符。

這是有問題的代碼:

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 打印它。 並且cout不知道如何打印Course對象,除非你提供一個重載的operator<<告訴它如何這樣做:

std::ostream& operator<<(std::ostream& out, const Course& course)
{
    out << course.getName(); // for example
    return out;
}

有關詳細信息,請參閱StackOverflow上的運算符重載聖經

流操作符<<用於“輸出”該對象的某些表示。 如果你不想重載運算符,只需選擇一些屬性來輸出:

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

您的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

由於您尚未學習重載operator<< ,因此您可以執行的操作是打印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;
    }
}

問題是operator <<不會重載您嘗試在語句中輸出的類型的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;

相反,成員函數可以重載operator <<。 例如

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;

你的問題是這個特殊的部分:

cout << c[i]

在你的情況下, c[i]是一個類型為Course的對象,正如dvnrrs正確指出的那樣。 所以要么:

  1. 為你的對象OR實現重載<<運算符
  2. 如果你的Course對象在某種程度上是一個原始的typedef嘗試顯式地將它轉換為字符串類型(或類似)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM