Strona 1 z 1

template <szablony>

Napisane: piątek, 15 lutego 2013, 18:58
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 ?

Re: template <szablony>

Napisane: sobota, 16 lutego 2013, 17:50
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.

Re: template <szablony>

Napisane: sobota, 16 lutego 2013, 22:59
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 >

Re: template <szablony>

Napisane: niedziela, 17 lutego 2013, 08:32
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 .

Re: template <szablony>

Napisane: niedziela, 17 lutego 2013, 13:06
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.

Re: template <szablony>

Napisane: niedziela, 17 lutego 2013, 14:42
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/