2010-04-29 5 views
2

J'ai une classe de paquet simple qui est surchargée pour que je puisse sortir des paquets de données simplement avec cout < < packagename. J'ai aussi deux types de données, le nom qui est une chaîne et le coût d'expédition avec un double.Problèmes d'opérateur avec cout

protected: 
    string name; 
    string address; 
    double weight; 
    double shippingcost; 

ostream &operator<<(ostream &output, const Package &package) 
{ 
    output << "Package Information ---------------"; 
    output << "Recipient: " << package.name << endl; 
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost; 

Le problème se produit avec la 4e ligne (sortie < < "bénéficiaire: ...). Je reçois l'erreur "aucun opérateur" < <" correspond à ces opérandes » . Cependant, la ligne 5 est très bien.

Je suppose que cela a à voir avec le type de données étant une chaîne pour le nom du package. Toutes les idées?

+0

utilisez-vous std :: string ou une autre bibliothèque de chaînes? – KillianDS

+0

Utilisation de string.h #include C'est dans mes deux fichiers .h et .cpp pour cette classe. Utilisant également l'espace de noms std (bien que cela devrait être clair par le fonctionnement des autres lignes). – BSchlinker

+4

Utilisez '' - '' est non standard et peut faire des choses bizarres. Idem pour '' etc. –

Répondre

9

Vous devez inclure un mauvais en-tête de chaîne. <string.h> et <string> sont deux en-têtes standard complètement différents.

#include <string.h> //or in C++ <cstring> 

C'est pour les fonctions de tableaux char à zéro terminal de type C (comme strcpy, strcmp etc). cstring reference

#include <string> 

C'est pour std::string. string reference

5

Vous êtes li kely manque #include <string>.

+0

J'avais #include au lieu de #include . – BSchlinker

-2

Utilisez cette option pour afficher la chaîne ..

sortie < < "bénéficiaire:" < < package.name.c_str() < < endl;

+3

Non, cela ne devrait pas être nécessaire - les surcharges de 'std :: string' sont fournies par la bibliothèque standard. –

+0

En fait, vous n'avez besoin de 'c_str()' que si vous voulez un 'char *', éventuellement pour le passer à une fonction de type C (par exemple 'printf'). -1 – xtofl

+0

J'ai compris! Désolé, je ne le savais pas. Merci! – Jujjuru

1

Essayez déclarant operator<< comme friend dans votre déclaration de classe:

struct Package 
{ 
public: 
    // Declare {external} function "operator<<" as a friend 
    // to give it access to the members. 
    friend std::ostream& operator<<(std::ostream&, const Package& p); 

protected: 
    string name; 
    string address; 
    double weight; 
    double shippingcost; 
}; 

std::ostream& 
operator<<(std::ostream& output, const Package& package) 
{ 
    output << "Package Information ---------------"; 
    output << "Recipient: " << package.name << endl; 
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost; 
    return output; 
} 

Par ailleurs, il est forme très mauvais d'utiliser des noms de variables qui ont le même nom que le type de données, à l'exception de différents Cas. Cela fait des ravages avec des outils de recherche et d'analyse. En outre, les fautes de frappe peuvent avoir des effets secondaires amusants aussi.

+0

Je ne suis pas d'accord avec le fait que les noms de variables ne devraient pas être nommés de la même manière que la classe, en effet, s'il s'agit d'une instance de la classe, c'est un nom parfaitement bien! Quels sont les outils de recherche et d'analyse qui n'acceptent pas le fait que la plupart des langages de programmation sont sensibles à la casse? –