[c++/ templates] konstruktor domyslny / zagadka

0
template<class Typ>
class Obiekt
{
	Typ pole1;
public:
	Obiekt();
	void ZrobCos(Typ T);
};

template<class Typ> Obiekt<Typ>::Obiekt()
{
	std::cout << "DZIALAM" << std::endl;
}

template<class Typ> void Obiekt<Typ>::ZrobCos(Typ T)
{
	pole1 = T;
}

class Elem
{
public:
	int ii;
	Elem(int aa);
	Elem();
};
Elem::Elem()
{ }

Elem::Elem(int aa)
{
	ii = aa;
}

int main()
{
	Elem E1(3);
	Obiekt<Elem> T1;
	T1.ZrobCos(E1);
}

I teraz moje pytanie, dlaczego kod powyżej nie zadziała jeśli nie zadeklarujemy konstruktora domyslnego Elem::Elem()?

0

Bo konstruktor klasy szablonowej Obiekt niejawnie wywołuje konstruktor domyślny typu będącego parametrem, inicjując swoją składową pole1.

0

nie no ok, ale zwykle bywalo tak ze kompilator sam tworzyl taki konstruktor jesli samemu siw go nie zadeklarowalo, a tutaj trzeba to zrobić z pełna swiadomoscia

0

Yyy, powinien działać bez konstruktora [???] Jaki kompilator ? Jaki błąd ?

0

kompilator: g++
blad:
templates_temp.cpp: In constructor Obiekt<Typ>::Obiekt() [with Typ = Elem]': templates_temp.cpp:40: instantiated from here templates_temp.cpp:13: error: no matching function for call to Elem::Elem()'
templates_temp.cpp:23: note: candidates are: Elem::Elem(const Elem&)
templates_temp.cpp:33: note: Elem::Elem(int)

Linia 40 to Obiekt<Elem> T1;

0

@pejotr
No jak dlaczego? A to "Typ pole1;" to co to jest? Nigdzie nie wołasz konstruktora Elem(int) a innego konstruktora nie ma... IMO takie jest wyjaśnienie, ale jak coś to za jaja mnie nie wieszajcie ;P

0

Aaaa, ja myślłem, że chodzi o konstruktor klasy Object, nie doczytałem [wstyd]
No sprawa jest prosta. Kompilator tworzy konstruktor domyślny tylko wtedy, jeśli w klasie nie został zdefiniowany żaden konstruktor.

0
adf88 napisał(a)

Aaaa, ja myślłem, że chodzi o konstruktor klasy Object, nie doczytałem [wstyd]

Ja właśnie na początku tak samo przeczytałem. I jak mi się skompilowało bez problemów to zacząłem się zastanawiać o co biega ;P

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