template <szablony>

Problemy i ich rozwiązania w C++.
gumbicp
Początkujący
Początkujący
Posty: 15
Dołączył(a): środa, 25 stycznia 2012, 08:47

template <szablony>

Post przez gumbicp »

Po długiej walce z szablonami :> wkoncu zaczyna mi to chodzić , ale mam pytanie .
Pisze te moje śmieszne programiki na linuxie więc często mam tu spore różnice ,ale
to nie jest dla mnie problemem. Chodzi o to że ten kod pana z szablonem klass
chodzi u mnie tylko w tej postaci :

Code: Zaznacz cały

#include <iostream>
using namespace std;
template<class T> //  w lekcjach TYPENAME T
class Punkt //klasa rodzic, klasa bazowa, superklasa
{
      protected:
      T x;
      public:
       Punkt(T =0);
       virtual ~Punkt();
       T getX();
       void setX(T);
};
template<class T>
Punkt<T>::Punkt(T x)
{
    cout << "Zostal wywolany konstruktor z klasy Punkt " << endl;
    this->x = x;             
}
template<class T>
Punkt<T>::~Punkt()
{
   cout << "Zostal wywolany destruktor z klasy Punkt " << endl;            
}
template<class T>
T Punkt<T>::getX()
{
    return this->x;
}


i teraz pytanie : czy to różnica wynikająca z systemów operacyjnych czy to poprostu już nowsza wersja C++ ? a może to jak to pan tam wspominał
róźnice tylko kompilatorów ?
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: template <szablony>

Post przez Morfidon »

Teoretycznie obie wersje są poprawne:
http://www.cplusplus.com/doc/tutorial/templates/

Tu masz trochę na ten temat:
http://blogs.msdn.com/b/slippman/archiv ... 12768.aspx

Jedynie co na ten moment mogę wywnioskować to to, że masz jakiś stary kompilator, który jeszcze nie zna "typename". Spróbuj zaktualizować kompilator. Sam jestem ciekaw co się stanie.
gumbicp
Początkujący
Początkujący
Posty: 15
Dołączył(a): środa, 25 stycznia 2012, 08:47

Re: template <szablony>

Post przez gumbicp »

Jutro przetestuje to na windows .. . ale na linux mint 14 kde mam aktualna wersje g++ kompilatora .
Plik pisalem i w edytorze tekstow nano plik.cpp i w code::blocksIDE i kompilacja nie wywala błędu ale po linkowaniu przy template<typename T> - pisało że w funkcji main() nie może znaleść referencji do obiektu podanego w Punkt<int"lub double">::Punkt() i tak dalej .. dopiero zmiana na template<class T> i wszystko smiga .. doczytam sobie jeszcze dokładniej te linki ale właśnie z tego pierwszego linku połapałem się że muszę dać <class T> zamiast <typename T >
gumbicp
Początkujący
Początkujący
Posty: 15
Dołączył(a): środa, 25 stycznia 2012, 08:47

Re: template <szablony>

Post przez gumbicp »

hmm .. na windows program dev++ 5.0 beta kompilatora używa g++.exe (taki zainstalował domyślnie) gdzie spodziewałem się że pana kod powinien iść,
dostaje ten sam błąd przy <typename T> [linker error] undefined reference to 'WinMain@10' - .. no i to zaczyna mnie coraz mocniej intrygować bo na <class T> program smiga bez problemu. No to czeka mnie lektura w temacie kompilatorów i wersji języka na necie bo to nie da mi spokoju :> . Jak znajdę rozwiązanie to wkleje tu linka .
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: template <szablony>

Post przez Morfidon »

No to ciekawe, że akurat u mnie to wtedy poszło ;) Może coś zmienili, nie śledziłem tego dokładnie. Z tego co teraz sprawdziłem w klasie przed chwilą musiałem dać "class", natomiast w funkcjach mogłem korzystać z typename. Chociaż szczerze powiedziawszy nie mam pojęcia czemu ma służyć ten zabieg. Zwłaszcza, że typename jest nowszy i sugeruje, że to jest jakiś typ zmiennej. double to typ zmiennej więc powinno przejść. Szczerze to jest to raczej mało istotne. To jest tylko semantyka, najważniejszy jest sam kod i co robi i jak robi.
gumbicp
Początkujący
Początkujący
Posty: 15
Dołączył(a): środa, 25 stycznia 2012, 08:47

Re: template <szablony>

Post przez gumbicp »

W sumie to nie jest aż tak ważne na moim etapie ... ;) jedyne co się dogrzebałem to wkoło macieju że jest to wymienne , przynajmniej było.
Druga ważna ciekawostka że jak do tej pory tylko jeden kompilator pozwala na rozwalenie szablonów z na plik.h i plik.cpp w przyszłości ma to też mieć VisualC++ windowsa jak dobrze pamiętam nazwe.
Jena tylko wzmianka o różnicach :

There is a difference, and you should prefer class to typename.
But why?

typename is illegal for template template arguments, so to be consistent, you should use class:

Code: Zaznacz cały

class Foo<template<class> typename MyTemplate, class Bar> { };    //  :(
class Foo<template<class>    class MyTemplate, class Bar> { };    //  :)
Nie wiem czy dobrze to rozumie : typename jest nie legalne dla szablonu szablonów argumentów , wiec aby być konsekwentnym , powinieneś użyć class

hmm trochę to dla mnie jeszcze zamotane. Ale za to znalazłem fajną kopalnie wiedzy dla osób znających język angielski :
http://tinf2.vub.ac.be/~dvermeir/
Post Reply