2012-04-24 5 views
2
ostream& operator <<(ostream& osObject, const storageRentals& rentals) 
{ 
    osObject << rentals.summaryReport(); 
    return osObject; 
} 

summaryReport() est une fonction de vide, et il me donne une erreur:<< Surcharger opérateur pour std :: ostream

no operator "<<" matches these operands

mais l'erreur est pas là si je change la fonction summaryReport à une int, mais le problème que j'ai avec cela est que vous devez retourner une valeur, et il est en train de l'imprimer sur l'écran.

void storageRentals::summaryReport() const 
{ 
    for (int count = 0; count < 8; count++) 
     cout << "Unit: " << count + 1 << " " << stoUnits[count] << endl; 
} 

Est-il possible de surcharger cout << avec une fonction vide?

Répondre

10

Vous devez définir summartReport prendre ostream& comme paramètre, comme indiqué ici:

std::ostream& storageRentals::summaryReport(std::ostream & out) const 
{ 
    //use out instead of cout 
    for (int count = 0; count < 8; count++) 
     out << "Unit: " << count + 1 << " " << stoUnits[count] << endl; 

    return out; //return so that op<< can be just one line! 
} 

puis appelez comme:

ostream& operator <<(ostream& osObject, const storageRentals& rentals) 
{ 
    return rentals.summaryReport(osObject); //just one line! 
} 

Par ailleurs, on ne l'appelle "surcharge Cout" . Vous devriez dire, « surcharge operator<< pour std::ostream

0

Il y a deux choses que vous devez faire ici Faire storageRentals::summaryReport() prendre un std::ostream& (vous pouvez défaut cela std::cout):..

void storageRentals::summaryReport(std::ostream& os) const 
{ 
    for (int count = 0; count < 8; count++) 
    { 
     os << "Unit: " << count + 1 << " " << stoUnits[count] << endl; 
    } 
} 

Ensuite, appeler ainsi:

ostream& operator <<(ostream& osObject, const storageRentals& rentals) 
{ 
    rentals.summaryReport(osObject); 
    return osObject; 
} 

Remarque: Un avantage de faire storageRentals::summaryReport() prendre un std::ostream& est que vous pouvez lui passer un std::ostringstream dans vos tests unitaires et d'affirmer qu'il fournit une sortie correcte.

0

Si vous surchargez cout, vous pouvez faire un autre endroit en utilisant code difficile à comprendre, ou plus confus. En fait, vous pourriez faire votre propre classe pour terminer le travail. par exemple. faites une classe class MyPring et surchargez operator <<.

0

Votre rapport de stockage est implicitement transmis en continu à cout. Imaginez quelqu'un appelant votre fonction de cette façon et ayant la location sur cout au lieu du fichier.

fstream fs("out.txt"); 
storageRentals rentals; 
fs << rentals; 

Pourquoi ne pas vous diffusez votre classe comme ceci:

ostream& operator <<(ostream& osObject, const storageRentals& rentals) 
{ 

    for (int count = 0; count < 8; count++) { 
     osObject << "Unit: " << count + 1 << " " << rentals.stoUnits[count] << endl; 
    } 
    return osObject; 
} 

Si le membre est stoUnits vous privé besoin de faire la fonction de courant un ami de votre classe de stockage.

friend ostream& operator<<(ostream& osObject, const storageRentals& rentals); 
Questions connexes