Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Boxa membrana tweeter infundata

ajutor

Whisky for Mac

Xiaomi 14 Gpay
 Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...
 De ce sunt oamenii nostalgici

Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?
 polita RCA ONLINE

Termostat frigider - verificare

Mai au PC-urile vreun viitor?

Centrala termica immergas
 

Unde e eroarea? std::unordered_map

- - - - -
  • Please log in to reply
12 replies to this topic

#1
wolfenste

wolfenste

    Member

  • Grup: Members
  • Posts: 531
  • Înscris: 02.05.2018
#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. Posted Image Poate gaseste cineva si imi spune si mie.

Edited by wolfenste, 21 June 2022 - 12:28.


#2
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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
Argv

Argv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,496
  • Înscris: 25.10.2007
Trebuie sa definesti si contructorul default:

Node();

Node::Node () {  
}

#4
wolfenste

wolfenste

    Member

  • Grup: Members
  • Posts: 531
  • Înscris: 02.05.2018

View Posttavitu, 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!

#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
map.emplace(std::make_pair("unu",Node ("unu")));

#6
wolfenste

wolfenste

    Member

  • Grup: Members
  • Posts: 531
  • Înscris: 02.05.2018
Totusi asta nu imi spune ce era gresit, doar ocoleste bug-ul.

#7
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
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
wolfenste

wolfenste

    Member

  • Grup: Members
  • Posts: 531
  • Înscris: 02.05.2018
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
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.


#10
wolfenste

wolfenste

    Member

  • Grup: Members
  • Posts: 531
  • Înscris: 02.05.2018
Pai aveam constructorul public.

#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Constructor fara argumente, ca nu stie map ce argumente sa-i ofere.

#12
wolfenste

wolfenste

    Member

  • Grup: Members
  • Posts: 531
  • Înscris: 02.05.2018
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
= 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

Second Opinion 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate