Salt la conținut

SUBIECTE NOI
« 1 / 5 »
RSS
Sa incurajam sporturile de contac...

Cum s-au apucat rapperii sa faca ...

Pareri despre eceasuri.ro: cumpar...

Mama Miresii (2024)
 Estimare reparatie

Sterilizare UV apa

Folii heliomate faruri - merita?

Cabina Dus mai mare cu 10cm decat...
 Rezultate firma

Facultatea de Medicina - a doua f...

Fortat sa imi dau demisia

Nivelare placa + Fisuri
 Premierul Slovaciei a fost impuscat

RIP imgflip meme generator

V-ati facut sau va veti face Colo...

Imagini generate de Inteligenta A...
 

Unde e eroarea? std::unordered_map

- - - - -
  • Vă rugăm să vă autentificați pentru a răspunde
12 răspunsuri în acest subiect

#1
wolfenste

wolfenste

    Member

  • Grup: Members
  • Mesaje: 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.

Editat de wolfenste, 21 iunie 2022 - 12:28.


#2
tavitu

tavitu

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

  • Grup: Senior Members
  • Mesaje: 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
  • Mesaje: 2.519
  • Înscris: 25.10.2007
Trebuie sa definesti si contructorul default:

Node();

Node::Node () {  
}

#4
wolfenste

wolfenste

    Member

  • Grup: Members
  • Mesaje: 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
  • Mesaje: 30.259
  • Înscris: 24.02.2007
map.emplace(std::make_pair("unu",Node ("unu")));

#6
wolfenste

wolfenste

    Member

  • Grup: Members
  • Mesaje: 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
  • Mesaje: 30.259
  • Î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
  • Mesaje: 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
  • Mesaje: 30.259
  • Î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.

Editat de dani.user, 26 iunie 2022 - 21:30.


#10
wolfenste

wolfenste

    Member

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

#11
dani.user

dani.user

    Guru Member

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

#12
wolfenste

wolfenste

    Member

  • Grup: Members
  • Mesaje: 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. :)

Editat de wolfenste, 11 iulie 2022 - 11:47.


#13
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Mesaje: 30.259
  • Î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

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

Utilizatori activi: 1

0 membri, 1 vizitatori, 0 utilizatori anonimi

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