2017-07-10 3 views
1
#include <iostream> 
#include <vector> 
using namespace std; 

class dog { 
public: 
    dog() {} 
    dog(dog & d) { 
    } 
}; 

int main() { 
    vector<dog> vec; 
    dog d; 
    vec.push_back(d); 
    return 0; 
} 

Je ne peux pas insérer un chien dans le vecteur. Le problème réside dans le constructeur de copie. Si j'ajoute const dans le constructeur de la copie, le code compile. Je me demande juste pourquoi je dois ajouter const dans le constructeur de copie.Pourquoi le vecteur ne peut-il pas insérer de classe avec ce constructeur de copie?

Le message d'erreur est:

error: binding ‘const dog’ to reference of type ‘dog&’ discards qualifiers

+0

https://stackoverflow.com/questions/1602058/why-is-the-copy-constructor-argument-const –

+0

https://stackoverflow.com/questions/441067/c-push- back-non-const-copy-constructor –

+1

Hey, nouvelle fonctionnalité d'édition de liste en double est cool –

Répondre

1

std::vector::push_back prend const T& en tant que paramètre (par lvalue), ce qui signifie quand il est appelé l'argument sera lié au paramètre de type const dog&, qui sera utilisée pour construire dog à l'intérieur du vector plus tard (dans push_back).

Pour cette construction de copie à atteindre, le constructeur de copie approprié (c.-à-dog::dog(const dog&) est nécessaire, mais la signature du constructeur de copie est dog::dog(dog&), qui ne peut pas prendre un const dog&, donc le compilateur n'a pas réussi à trouver le constructeur de copie approprié pour effectuer l'opération

+0

@BenjaminLindley Oui, ce n'était pas assez clair, de toute façon j'ai essayé de le rendre plus clair. – songyuanyao