Szablony funkcji;

0

Witam,
mam pytanie odnosnie szablonow funkcji. Zalozmy ze mam taki kod:

#include <iostream>

using namespace std;

template <class TYPE>
void cos(TYPE a, TYPE b) {
	cout << "dziala funkcja cos" << endl;
	
return;	
}


class pod {
public:
	int m;		

};

class podst: public pod {
public:
	int w;
	
};


int main() {
	
	const int m = 5;
	cos(m, 5);
	
	pod *wsk_pod;
	podst *wsk_podst;
	
	cos(wsk_pod, wsk_podst);
	
	system("pause");
return 0;	
}

Problem w tym ze nie wiem dlaczego kompilator nie zgadza sie na wywolanie funkcji cos(TYPE a, TYPE b) z argumentami *wsk_pod i *wsk_podst. Ucze sie C++ z ksiazki Pasja C++. Jak wiadomo nie jest to najnowsza ksiazka, a sam autor pisze ze w nowym standardzie C++ (zapewnie ISO 98) ma sie to zmienic. Czy ktos zyczliwy moze mi napisac czy sie zmienilo czy nie ?

0

Nie jestem pewny ale wydaje się to oczywiste. Dwa parametry w tej funkcji są typu TYPE więc dowolnego ale TEGO SAMEGO bo TYPE dlatego pierwsze wywołanie działa - dwa int, drugie nie bo są to dwie różne klasy.

0

Zgadzam sie ale zauwaz ze jedna jest pochodna od drugiej, sa ta wskazniki wiec dzieki wskaznik od klasy podstawowej moze pokazywac na klase pochodna. W pierwzszym zajdzie konwersja z int na const int, to w drugim zajdzie konwersja z wsk_pod na wsk_podst (przynajmniej tak mi sie wydaje).

0

Konwersja z int na const int jest konwersją niejawną, natomiast konwersja z jakiejś klasy na klasę pochodną musi być jawna. Czyli trzeba napisać:

cos(wsk_pod, (pod*)wsk_podst);

cos((podst*)wsk_pod, wsk_podst);

0

Ok, dzieki - juz rozumiem :)

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