Va rog putin ajutor daca se poate!Problema cu un sablon

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
cam
Junior
Junior
Posts: 12
Joined: 09 Jun 2011, 16:36
Judet: Bucureşti

Va rog putin ajutor daca se poate!Problema cu un sablon

Post by cam » 18 Sep 2012, 21:49

Salutare!
Va rog sa ma ajutati daca se poate..Intampin o problema cu un sablon destul de simplu.Codul nu pare a avea erori de sintaxa sau logice dar compilatorul refuza
sa-mi ruleze micul program.Ideea e ca am incercat si Microsoft Visual 2010 dar fara nici un rezultat.Ms pt ajutor!
Sa fie oare o problema legata de compilator?
Codul este cel de mai jos:
#include <iostream>
using namespace std;
template <class T> T compara_valori (T a, T b)
{
return ((a > b) ? a: b);
}

float compara_valori (float a,float b);

int compara_valori(int a, int b);

long compara_valori(long a, long b);

int main ()
{
float a = 1.2345, b = 2.34567;
cout << "Comparam " << a << ' ' << b << ' ' << compara_valori (a,b) << endl;
int c = 1, d = 1001;
cout << "Comparam " << c << ' ' << d << ' ' << compara_valori (c,d) << endl;
long e = 1010101L, f = 2020202L;
cout << "Comparam " << e << ' ' << f << ' ' << compara_valori (e,f) << endl;
system("pause");
}



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Va rog putin ajutor daca se poate!Problema cu un sablon

Post by Ovidiu Cucu » 19 Sep 2012, 08:29

1. Compilatorul compileaza (transforma codul sursa in limbaj masina), nu ruleaza programe.
2. Ai trei declaratii de functii fara definitie (implementare); din cauza asta da eroare de linkeditare (Unresolved external symbol...);
3. Odata ce ai definit functia template compara_valori nu mai ai nevoie de celelalte trei functii compara_valori supraincarcate.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Va rog putin ajutor daca se poate!Problema cu un sablon

Post by Ovidiu Cucu » 19 Sep 2012, 09:48

Incerc sa lamuresc putin afirmatia de mai sus de la punctul 1.

De la codul/programul sursa scris in limbajul de programare C++ si pana la programul executabil, exista doua faze mari si late:
  • Compilarea in care se transforma codul sursa in limbaj masina (instructuni microprocesor).
    Atunci cand alegi "Compile" din meniul de la Visual Studio sau apesi Ctrl+F7 intra in actiune un programel numit compilator care asta face: compileaza adica transforma codul sursa in limbaj masina.
    In urma compilarii nu rezulta programul executabil ci asazisele module obiect (fisiere intermediare cu extensia .obj, care contin cod masina).
    Pot rezulta unul sau mai multe module obiect, depinzand de numarul fisierelor sursa (.cpp) din proiect.
  • Linkeditarea (editarea de legaturi) in care se pun la un loc modulele obiect rezultate in urma compilarii, alte eventuale biblioteci/module externe (lib-uri, obj-uri, etc), rezolvandu-se dependentele/legaturile dintre ele (apeluri de functii dintr-un modul in altul, etc).
    Cu editarea de legaturi se ocupa un alt programel numit linker (editor de legaturi) care din Visual Studio intra in actiune atunci cand dai "Build", F7 cat si in urma altor comenzi daca e nevoie, de exemplu cand dai "Start Debugging", F5, Ctrl+F5, etc.
    In urma editarii de legaturi rezulta programul executabil (.exe, .scr etc) sau o biblioteca (.dll, .lib etc).
Un program executabil nu este rulat nici de compilator, nici de editorul de legaturi ci de sistemul de operare (Windows in cazul nostru).

Si inca ceva:
Microsoft Visual Studio NU este un compilator ci un IDE (Integrated Development Environment, pe romaneste Mediu Integrat de Dezvoltare) care cuprinde pe langa compilator si editor de legaturi, un editor pentru codul sursa, debugger, biblioteci, tool-uri si multe alte minunatii care te ajuta sa dezvolti programe/proiecte/aplicatii.

Astea ar trebui sa se predea la cursul de C++ inainte de orice "Hello World" si nu dupa lectia de functii template. :)

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Va rog putin ajutor daca se poate!Problema cu un sablon

Post by Silviu Ardelean » 19 Sep 2012, 12:09

Daca ti-ai facut o metoda template atunci foloseste-o. NU mai ai nevoie sa supraincarci functiile tale ci doar sa folosesti corespunzator metoda ta cu template.

Code: Select all

#include <iostream>
using namespace std;

template <class T>  
T compara_valori(T a, T b)
{
  return ((a > b) ? a: b);
}

//float compara_valori (float a,float b);
//int compara_valori(int a, int b);
//long compara_valori(long a, long b);

int main ()
{
	float a = 1.2345f, b = 2.34567f;
	cout << "Comparam " << a << ' ' << b << ' ' << compara_valori<float>(a,b) << endl;
	int c = 1, d = 1001;
	cout << "Comparam " << c << ' ' << d << ' ' << compara_valori<int>(c,d) << endl;
	long e = 1010101L, f = 2020202L;
	cout << "Comparam " << e << ' ' << f << ' ' << compara_valori<long>(e,f) << endl;
	system("pause");

	
	return 0;
}

cam
Junior
Junior
Posts: 12
Joined: 09 Jun 2011, 16:36
Judet: Bucureşti

Re: Va rog putin ajutor daca se poate!Problema cu un sablon

Post by cam » 19 Sep 2012, 12:33

Salutare!
Ms pt ajutor si lamurire!Recunosc faptul ca exprimarea mea nu a fost una pe masura legata de compile,build si start without debugging din Ide-ul Microsoft Visual Studio.Probabil s-a datorat aseara oboselii si stresului acumulat in ultima vreme.
Ms inca o data pt ajutor si lamuriri!

cam
Junior
Junior
Posts: 12
Joined: 09 Jun 2011, 16:36
Judet: Bucureşti

Re: Va rog putin ajutor daca se poate!Problema cu un sablon

Post by cam » 19 Sep 2012, 12:39

Ms Ovidiu si Silviu!Totul functioneaza corect.Metoda template functioneaza normal.Am inteles unde facusem greseala...

adr_dev
Junior
Junior
Posts: 1
Joined: 24 Jan 2014, 23:38

Re: Va rog putin ajutor daca se poate!Problema cu un sablon

Post by adr_dev » 24 Jan 2014, 23:41

El incerca un exemplu din Cartea C si C++ Kris Jamsa care era scris asa.

Post Reply