为什么我得到这个错误:在C++中'operator <<'不匹配?
问题描述:
请帮我解释为什么我在提到评论家时发生错误。我真的被困在这里! 我应该给出哪些其他细节?为什么我得到这个错误:在C++中'operator <<'不匹配?
Main.cpp的
#include <iostream>
#include<person.h>
#include <sstream>
int main()
{
cout << "Constructor Overloading Demo !!!" << endl;
person vish;
cout << vish.toString() << endl; /* I get an error for this statement though I feel this is correct */
return 0;
}
person.cpp //构造函数定义文件
#include "person.h"
#include <sstream>
person::person()
{
name = "vish";
age = 25;
//ctor
}
void person::toString()
{
stringstream st;
st << "Name: ";
st << name;
st << "& Age: ";
st << age;
prnt = st.str();
cout << prnt << endl;
//return 10;
}
person.h //构造函数声明
#ifndef PERSON_H
#define PERSON_H
#include<iostream>
using namespace std;
class person
{
public:
person();
void toString();
//virtual ~person();
protected:
private:
string name;
int age;
string prnt;
};
#endif // PERSON_H
答
同方法person::toString()
的顾名思义它应该返回string
,而不是void
(这意味着方法不返回任何东西):
class person {
...
std::string toString();
//^--------- type should be changed
当然
需要相应地改变这种方法实现:
std::string person::toString()
{
stringstream st;
st << "Name: ";
st << name;
st << "& Age: ";
st << age;
return st.str();
}
I realize that my function was returning void. but my question is: why does that matter ?
你的输出cout
是这样的:
cout << vish.toString(); // endl is omitted for clarity
这等于以下之一:
cout.operator<<(vish.toString());
operator<<(cout, vish.toString());
什么都可用。这意味着函数或方法operator<<
需要调用toString()
的结果,并且它不能接受void
。如果你只是想从方法toString()
写打印:
vish.toString();
,将正常工作(除非方法名是仍扑朔迷离,但编译器不关心)。
答
运营商< <需要一个字符串传递给它。你的ToString函数返回void
string person::toString()
{
stringstream st;
st << "Name: ";
st << name;
st << "& Age: ";
st << age;
return st.str();
}
编辑:
声明
std::cout << vish.toString();
是相同的
std::cout.operator<<(vish.toString());
原型为操作者
std::ostream& operator<<(std::string);
std::ostream& operator<<(int);
//...
该函数需要一个字符串或其他参数作为参数。 您的功能被定义为独立打印功能。所以它应该如上所述进行修改或者自行调用。
函数名称'toString()'意味着该函数返回可用于任何事物的对象的字符串表示形式,而不仅仅是打印,因此它应该返回一个字符串。如果函数打印对象,则应该将其称为“打印”而不是“toString”。
偏题:如果你真的要使用'命名空间标准;'**确定不要把它放在标题**中。 –
那么,开始'人:: toString'是类型'无效',我不认为iostream的' infixed
@infixed是否有可能有这样的过载? – Slava