2017-06-17 5 views
0

Je me demande comment utiliser std :: copy pour utiliser l'opérateur de surcharge de ma classe. Par exemple, pour imprimer vecteur de type int on peut utiliser quelque chose comme çaStd :: copy et std :: ostream_iterator pour utiliser la fonction de surcharge pour imprimer des valeurs

std::vector<int> vec{ -1, 4, 70, -5, 34, 21, 2, 58, 0 , 34 , 27 , 4 }; 
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " ")); 

Mais dire que j'ai opérateur de classe des employés et la surcharge < <

class Employee 
{ 

public: 
    Employee(const string _name, const string _last, const int _sal): 
     name(_name), 
     lastname(_last), 
     salary(_sal) 
    { 

    } 
friend ostream& operator<<(ostream&os, Employee&obj) 
{ 
    return os << obj.name << " "<< obj.salary; 
} 

private: 
    std::string name; 
    std::string lastname; 
    int salary; 

}; 

Alors comment pourrais-je utiliser std :: copie utiliser ostream_iterator pour imprimer le nom de l'exemple des employés et le salaire

int main() 
{ 
    std::vector<Employee> staff 
    { 
     {"tim", "sim", 1000 }, 
     {"dave", "ark", 2000 }, 
     {"kate", "Greg", 2000 }, 
     {"miller", "jane", 1000 }, 
     {"wht", "Up", 2000 } 

    }; 

std::copy(begin(staff), end(staff), std::ostream_iterator<Employee>(cout, " ")); // How to use this line ??? 
return 0; 
} 

Lorsque je tape dessus de la ligne, je suis erreur du compilateur Opérandes invalides à l'expression binaire

+1

Veuillez fournir un [MCVE] si nécessaire. –

+0

C'est un code minimal qui peut causer des problèmes. Je ne sais pas sérieusement ce que plus d'informations je peux fournir. Tout ce que je veux faire est d'utiliser std :: copy pour imprimer le salaire et le nom. Je peux utiliser pour la boucle pour cela mais je suis intéressé à savoir comment faire avec std :: copy. – samprat

+2

_ "C'est un code minimal qui peut produire un problème" _ [Vraiment ??] (http://coliru.stacked-crooked.com/a/b0006f46eb41dec2) –

Répondre

2

std::ostream_iterator::operator= prend son paramètre en tant que const&. En interne, cela utilisera operator<< pour afficher chaque valeur dans le flux.

Mais le paramètre est const, donc il ne peut pas être passé dans votre operator<<! Un const& ne lie pas à &. C'est pourquoi le compilateur se plaint. Vous devez marquer const&:

friend ostream& operator<<(ostream&os, const Employee& obj) 
{ 
    return os << obj.name << " "<< obj.salary; 
} 

C'est aussi une bonne pratique: Tu ne vas pas modifier obj, donc il n'y a aucune raison pour que vous ne marquez pas comme const.

+0

Merci beaucoup mon pote. Ça marche. – samprat