Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Unde e eroarea? std::unordered_map
Last Updated: Jul 18 2022 10:47, Started by
wolfenste
, Jun 21 2022 12:23
·
0
#1
Posted 21 June 2022 - 12:23
#include <iostream> #include <unordered_map> class Node { public: std::string m_name; Node (std::string name); }; Node::Node (std::string name) { m_name = name; } int main (void) { std::unordered_map <std::string, Node> map; auto n {Node ("unu")}; // No error map ["unu"] = Node ("unu"); // Error // candidate: 'Node::Node(std::string) // candidate expects 1 argument, 0 provided return 0; } Daca folosesc un vector in loc de unordered_map functioneaza fara eroare. Daca fac Node fara constructor functioneaza si cu unordered_map. Stiu ca e ceva stupid dar momentan renunt ca pierd timpul. Poate gaseste cineva si imi spune si mie. Edited by wolfenste, 21 June 2022 - 12:28. |
#2
Posted 21 June 2022 - 13:22
Nu am mai lucrat cu C++ de foarte mulți ani, așa ca sunt șanse mari să greșesc, dar
1. Când ai declarat constructorul tău cu argument name, ai eliminat constructorul implicit fără nici un argument. 2. map["unu"] mai întâi va încerca să creeze un obiect de tip Node folosind constructorul implicit, care în cazul tău nu mai există => eroarea cu 0 provided. |
#3
Posted 21 June 2022 - 13:24
Trebuie sa definesti si contructorul default:
Node(); Node::Node () { } |
#4
Posted 21 June 2022 - 13:50
tavitu, on 21 iunie 2022 - 13:22, said:
Nu am mai lucrat cu C++ de foarte mulți ani, așa ca sunt șanse mari să greșesc, dar 1. Când ai declarat constructorul tău cu argument name, ai eliminat constructorul implicit fără nici un argument. 2. map["unu"] mai întâi va încerca să creeze un obiect de tip Node folosind constructorul implicit, care în cazul tău nu mai există => eroarea cu 0 provided. Pff, da acum merge cu un constructor gol in plus pe acolo. 2. Eroarea imi spune ca este folosit constructorul meu Node:Node (std::string name) si ca nu ii furnizez argumentul cerut in definitie dar eu il furnizam. E vina mea, fara indoiala, dar tine si de modul neintuitiv in care lucreaza unordered_map de vreme ce in alte circumstante (cu vector sau variabila normala) compilatorul stie sa se descurce. Multumesc frumos! |
#6
Posted 25 June 2022 - 13:04
Totusi asta nu imi spune ce era gresit, doar ocoleste bug-ul.
|
#7
Posted 25 June 2022 - 21:01
map ["unu"] introduce elementul daca nu exista. Daca ai constructor cu parametrii nu stie map ce parametrii sa-i dea pentru a-l crea cand il introduce.
|
#8
Posted 26 June 2022 - 08:50
Ce treaba are map cu constructorul lui Node? De ce ar trebui sa stie map ce argument primeste constructorul lui Node? map ["unu"] ar trebui sa ia un obiect gata facut de expresia Node ("unu").
Ceva se intampla si cu map asta, daca incerci sa compilezi o sa primesti un mesaj de eroare mult mai lung in care map se plange el de ceva dar nu inteleg eu ce, are de-a face cu definitia mai multor chestii din librarie si nu m-as apuca acum sa sap. E mai rapid sa intrebi pe softpedia. |
#9
Posted 26 June 2022 - 21:29
map["unu"] ia obiectul daca-l gaseste, dar daca nu-l gaseste creaza unul. Daca n-ai constructor public, nu stie cum sa-l creeze => eroare la compilare.
= Node("unu") vine ulterior. Obiectul deja creat e inlocuit de altul. Pentru a evita asta se foloseste emplace. Edited by dani.user, 26 June 2022 - 21:30. |
#11
Posted 27 June 2022 - 10:44
Constructor fara argumente, ca nu stie map ce argumente sa-i ofere.
|
#12
Posted 11 July 2022 - 11:44
map ["unu"] = Node ("unu");
De ce trebuie sa stie map de maruntaiele lui Node? map e la stanga lui = La dreapta lui =, Eu ii dau explicit argument pentru constructorul lui Node. Astfel este creat un obiect Node complet care mai apoi este atribuit lui map ["unu"]. Iar Node ("unu") inseamna ca Eu am ales sa folosesc exact acel constructor cu semnatura Node (std::string). map sa stea cuminte la locul lui si sa astepte ce-i dau. Edited by wolfenste, 11 July 2022 - 11:47. |
#13
Posted 18 July 2022 - 10:47
= inseamna ca modifici ceva existent. In acest caz tu creezi Node("unu") dar apoi modifici cel din map cu =, ori pentru asta trebuie sa existe deja in map, iar map nu stie cum sa-l creeze pentru a exista deja. Deci trebuie emplace pentru a-i spune lui map sa introduca ceva deja creat, nu sa incerce sa creeze ceva ce nu stie cum.
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users