C++ qu'est-ce que “instancié à partir d'ici” erreur?
Je suis nouveau dans la programmation en C++, je me demande qu'est-ce que "instancié à partir d'ici" erreur?
struct Data {
Data(int a, int b) {
x = a;
y = b;
}
int x;
int y;
};
std::map<int, Data> m;
m[1] = Data(1, 2);
J'ai eu plusieurs messages d'erreur
- no matching function for call "de Données::Data()"
- "instancié à partir d'ici" erreur
Grâce.
OriginalL'auteur 2607 | 2012-04-03
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de constructeur par défaut pour
struct Data
. Lecarte::operator[]
renvoie une valeur par défaut construit instance de son type de valeur, dans ce casstruct Data
.Fournir un constructeur par défaut:
ou de l'utilisation
std::map::insert()
:Il permettra de remplacer la valeur existante.
est incorrect. À partir de la docs "Parce que l'élément clés dans une carte unique, l'insertion de l'opération vérifie si chaque élément inséré est une clé équivalente à celle d'un élément déjà dans le récipient, et, dans l'affirmative, l'élément n'est pas inséré, le retour d'un itérateur de cet élément existant (si la fonction retourne une valeur)."
OriginalL'auteur hmjd
Qui n'est pas une erreur, mais la continuation de la précédente erreur lors de l'ajout d'informations supplémentaires. Le compilateur est l'ajout de la
error:
préfixe de sorte qu'il est plus facile à lire (ou analyse) ce que les lignes appartiennent à l'erreur.Vous pouvez lire le bloc entier comme une seule erreur:
Pas de correspondance appel à la fonction
Data::Data()
instanciés à partir de...OriginalL'auteur David Rodríguez - dribeas
Vous devez fournir un constructeur qui ne prend pas d'arguments.
OriginalL'auteur Alok Save
Cela signifie que l'erreur (le "No matching function call") est devenu évident que lorsque le compilateur a commencé à résoudre (l'instanciation de) le modèle
std::map::map()
.OriginalL'auteur leftaroundabout
Lorsque vous insérez un élément dans une carte à l'aide
operator[]
, ce qui se passe, c'est que la carte insère par défaut-objet construit pour la clé spécifiée pour les consulter, alors la valeur que vous attribuez est copié dans que par défaut de l'objet construit.Pour créer que par défaut-objet construit, un constructeur par défaut doit être disponible. Dans votre cas, sine vous avez spécifié un constructeur qui prend deux arguments (et non pas fourni les valeurs par défaut pour ces arguments), le compilateur va pas synthétiser automatiquement un constructeur par défaut pour vous.
Dans les circonstances, je serais probablement modifier votre constructeur à quelque chose comme ceci:
Notez que vous devez généralement préfèrent l'initialisation des variables dans une liste d'initialisation (si possible) sur l'affectation dans le corps du constructeur.
OriginalL'auteur Jerry Coffin
Vous devez fournir un constructeur par défaut. Voir la réponse à cette question:
Modèle d'Erreur: il n'y a pas de constructeur par défaut disponible
Vous ne pouvez avoir que des déclarations de variables dans la zone globale. Vous avez besoin de faire cession de l'intérieur d'une fonction. Code Correct:
OriginalL'auteur mihai