Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Uzucapiune teren intravilan

Recomandare aparat foto

Ariston "Genus One+" 24kw...

unde ii pot arunca?
 Problema respingere memorie supli...

Posibila virusare

Material opac developat filme

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
 

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,509
  • Î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,252
  • Î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,252
  • Î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,252
  • Î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,252
  • Î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,252
  • Î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