2016-07-14 107 views
0

请帮我解释为什么我在提到评论家时发生错误。我真的被困在这里! 我应该给出哪些其他细节?为什么我得到这个错误:在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 
+2

偏题:如果你真的要使用'命名空间标准;'**确定不要把它放在标题**中。 –

+4

那么,开始'人:: toString'是类型'无效',我不认为iostream的'<<'有'无效'的重载 – infixed

+0

@infixed是否有可能有这样的过载? – Slava

回答

2

同方法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(); 

,将正常工作(除非方法名是仍扑朔迷离,但编译器不关心)。

+0

我意识到我的函数返回void。但我的问题是:为什么这很重要?作为函数返回void,我打印出我想要的,而不是使用任何return语句? – Vish

+0

@Vish查看更新回答 – Slava

+0

我现在看到了。谢谢你斯拉瓦:) – Vish

1

运营商< <需要一个字符串传递给它。你的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”。

+0

我意识到我的功能正在返回无效。但我的问题是:为什么这很重要?作为函数返回void,我打印出我想要的,而不是使用任何return语句? – Vish

+0

增加了附加信息 – Samuel

+0

谢谢用户2666293 – Vish

相关问题