为什么我收到此错误:'运营商<<<'在C ++中?

时间:2016-07-14 18:28:34

标签: c++

请帮我解释为什么我在提到评论员时出现错误。我真的被困在这里了! 我应该准确提供哪些其他细节?

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 个答案:

答案 0 :(得分:3)

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

我意识到我的功能正在返回无效。但我的问题是:为什么重要?

您对cout的输出是:

cout << vish.toString(); // endl is omitted for clarity

等于以下之一:

cout.operator<<( vish.toString() );
operator<<( cout, vish.toString() ); 

无论有什么。这意味着函数或方法operator<<需要调用toString()的结果,并且无法接受void。如果您只想从方法toString()打印,请写:

vish.toString();

可以正常工作(除了方法名称仍然会令人困惑,但编译器并不关心)。

答案 1 :(得分:2)

运营商LT;&LT;期望将一个字符串传递给它。你的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()'意味着函数返回对象的字符串表示形式,可以用于任何事情,而不仅仅是打印,因此它应该返回一个字符串。如果函数打印对象,则应将其称为“print”而不是“toString”。