Szablony funkcji

0

Witam,
jestem na etapie uczenia się języka C++. Mam takie problematyczne pytanie

Mam następujący kod:

template<class T, class C> void foo(T op1, C op2){}; // linia_1
template<class C, class T> void foo(C op1, T op2){}; // linia_2
template<class T, class C> void foo(C op1, T op2){}; // linia_3
 

Pytanie brzmi: jeśli sprobuje skompilować kod powyżej,która z linii spowoduje pojawienie się błędu?

Odpowiedz to linia_2. Jest ktoś w stanie mi wytłumaczyć dlaczego tak jest?

Czy chodzi o przeladowanie funkcji foo? Lista argumentow funkcji w linii 2 i 3 jest ta sama, roznia sie kolejnoscia typow w deklaracji template. Dlaczego ten spowouje linia 2 a nie 3?

0

Wywołanie w praktyce:

foo<Klasa1, Klasa2>(arg1, arg2);

Dla pierwszej linijki (T dostanie Klasa1, a C Klasa2):
zostanie to rozwinięte do (przyglądam się tylko typom):

template<class T, class C> void foo(T op1, C op2){}; // rozwinie się do:
foo(Obiekt_typu_Klasa1, Obiekt_typu_Klasa2);

druga (C dostanie Klasa1, a T Klasa2):

template<class C, class T> void foo(C op1, T op2){}; // rozwinie się do:
foo(Obiekt_typu_Klasa1, Obiekt_typu_Klasa2);

trzecia (T dostanie Klasa1, a C Klasa2):

template<class T, class C> void foo(C op1, T op2){}; //rozwinie się do:
foo(Obiekt_typu_Klasa2, Obiekt_typu_Klasa1);

Pierwsza i druga wyglądają tak samo. Kompilator nie wie którą funkcję chcesz wywołać.

0

Odpowiedź jest bardzo prosta. Bo kompilator natknie się na nią wcześniej i się wyłoży już wtedy, bo wszystkie 3 funkcje są takie same (różnica jest jak sam zauważyłeś w kolejności typów generycznych, ale przy wywołaniu to i tak nie gra różnicy, z punktu widzenia kompilatora wszystkie te funkcje są takie same).

1 użytkowników online, w tym zalogowanych: 0, gości: 1