Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
unde ii pot arunca?

Problema respingere memorie supli...

Posibila virusare

Caramida de sticla la exterior
 Geam cuptor crapat

Un canal de AI de comedie pe YT

Update intr-un tabel

[Controlul] vremii si a vremurilor
 Blocuri din placi prefabricate

Achiziție mașina de fam...

[unde] cozonaci traditionali

Jandarmii in fondul forestier
 Sa dus seceta pedologica?

Toyota IQ

Numar magic cu blocaj numerologic

Recomandare firma/persoana pentru...
 

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,508
  • Î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,251
  • Î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,251
  • Î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,251
  • Î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,251
  • Î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,251
  • Î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

Bun venit pe Forumul Softpedia!

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