没有运算符 << 匹配这些操作数
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<<
来告诉它如何打印:
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】:流操作符<<
用于“输出”该对象的某些表示。如果您不想重载运算符但只需选择一些属性来输出:
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<<
,因此您可以做的是打印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 << c[i]
在您的情况下,c[i]
是 Course
类型的对象,正如 dvnrrs 正确指出的那样。所以要么:
-
为您的对象实现重载的
如果您的
Course
对象在某种程度上是原始类型的 typedef
,请尝试将其显式转换为字符串类型(或类似类型)
【讨论】:
以上是关于没有运算符 << 匹配这些操作数的主要内容,如果未能解决你的问题,请参考以下文章