eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › szablony metod - deklaracja i definicja
Ilość wypowiedzi w tym wątku: 20

  • 11. Data: 2009-08-27 13:01:03
    Temat: Re: szablony metod - deklaracja i definicja
    Od: Tomasz Bywalec <t...@p...dont.spam.me.o2.pl>

    Megas pisze:
    [...]
    >
    > template void foo<int>();
    >
    > Jaki jest cel ostatniej lini 'template void foo<int>(); ?? i czy mozna to
    > samo zrobic w przypadku funkcji skladowej klasy??
    >

    Ta linijka powoduje że w tym miejscu szablon funkcji foo zostaje
    rozwinięty (skonretyzowany) z parametrem <int> - to znaczy,
    zostanie utworzona "konkretna" wersja funkcji, na podstawie
    szablonu.

    Zrobiłem u siebie mały test - poniższy przykład rozbity jest na 3 pliki,
    u mnie działa, spróbuj może zaadaptować to na potrzeby swojego programu:
    (całość działa u mnie, tyle że na VC++ 2008 EE).

    ==================
    Plik tmp2.hpp
    ==================

    #include <string>

    namespace tmp {

    // Zwyczajna klasa, z jednym szablonem metody.
    class Printer {
    public:
    Printer( const std::string& prefix ) : prefix_( prefix ) {}

    // Deklaracja szablonu metody (bez definicji).
    template <class T> void print_type();

    private:
    std::string prefix_;
    };

    }

    ===================
    Plik tmp2.cpp
    ===================

    #include "tmp2.hpp"
    #include <iostream>

    namespace tmp {

    // Definicja szablonu metody.
    template <class T>
    void Printer::print_type()
    {
    std::cout << prefix_ << ": " << typeid(T).name() << std::endl;
    }

    // Konkretyzacje szablonu dla trzech typow.
    template void Printer::print_type<int>();
    template void Printer::print_type<char>();
    template void Printer::print_type<double>();

    }

    =========================
    Plik tmp2-main.cpp (test)
    =========================

    #include "tmp2.hpp"

    using tmp::Printer;

    int main()
    {
    Printer p1( "aha" );
    p1.print_type<int>();
    p1.print_type<char>();
    p1.print_type<double>();
    // z tym nie dziala (blad kompilacji): p1.print_type<float>();
    // czego oczywiscie nalezalo sie spodziewac.
    }

    ===========================

    Pozdrawiam,
    Tomek Bywalec


  • 12. Data: 2009-08-27 13:09:15
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Tomasz Bywalec" <t...@p...dont.spam.me.o2.pl> napisał w
    wiadomości news:h7606u$5st$1@atlantis.news.neostrada.pl...
    > Megas pisze:
    >

    A czy takie cos by Ci poszlo?? Zmiany zaznaczyłem za pomoca komentarza
    '<-------- moja zmiana'



    ==================
    Plik tmp2.hpp
    ==================

    #include <string>

    namespace tmp {

    // Zwyczajna klasa, z jednym szablonem metody.
    class Printer {
    public:
    Printer( const std::string& prefix ) : prefix_( prefix ) {}

    // Deklaracja szablonu metody (bez definicji).
    template <class T>
    void print_type( class T obj); // <-------- moja zmiana

    private:
    std::string prefix_;
    };

    }

    ===================
    Plik tmp2.cpp
    ===================

    #include "tmp2.hpp"
    #include <iostream>

    namespace tmp {

    // Definicja szablonu metody.
    template <class T>
    void Printer::print_type( class T obj) // <-------- moja zmiana
    {
    std::cout << prefix_ << ": " << obj << std::endl; // <-------- moja
    zmiana
    }

    // Konkretyzacje szablonu dla trzech typow.
    template void Printer::print_type<int>(int); // <-------- moja zmiana
    template void Printer::print_type<char>(char); // <-------- moja zmiana
    template void Printer::print_type<double>(double); // <-------- moja zmiana

    }

    =========================
    Plik tmp2-main.cpp (test)
    =========================

    #include "tmp2.hpp"

    using tmp::Printer;

    int main()
    {
    Printer p1( "aha" );
    p1.print_type(1); // dla int <-------- moja zmiana
    p1.print_type('a'); // dla char <-------- moja zmiana
    p1.print_type(1.43); // dla double <-------- moja zmiana
    }




  • 13. Data: 2009-08-27 13:16:14
    Temat: Re: szablony metod - deklaracja i definicja
    Od: Tomasz Bywalec <t...@p...dont.spam.me.o2.pl>

    Megas pisze:
    > Użytkownik "Tomasz Bywalec" <t...@p...dont.spam.me.o2.pl> napisał w
    > wiadomości news:h7606u$5st$1@atlantis.news.neostrada.pl...
    >> Megas pisze:
    >>
    >
    > A czy takie cos by Ci poszlo?? Zmiany zaznaczyłem za pomoca komentarza
    > '<-------- moja zmiana'
    >
    [...]

    Działa - tylko bez słowa kluczowego "class" na liście argumentów funkcji
    (w tym miejscu nie jest ono używane, jedynie w liście parametrów
    szablonu).

    Czyli wszelkie void print_type( class T obj ) zamienić na
    void print_type( T obj ).

    Mam nadzieję że teraz wszystko zadziała bez problemu.

    Pozdrawiam,
    Tomek Bywalec


  • 14. Data: 2009-08-27 13:22:59
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Tomasz Bywalec" <t...@p...dont.spam.me.o2.pl> napisał w
    wiadomości news:h761ib$nsj$1@nemesis.news.neostrada.pl...
    > Megas pisze:
    >
    > Mam nadzieję że teraz wszystko zadziała bez problemu.

    Juz wiem gdzie sa jaja. Moja klase z szablonem funkcji zaimplementowałem w
    pliku *.dll, zas jej uzycie bylo zaimplementowane w pliku *.exe !!
    Kiedy przenioslem uzycie funkcji szablonowej z *.exe do *.dll wszystko
    zaczelo dzialac.



  • 15. Data: 2009-08-27 13:23:28
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Megas" <k...@o...eu> napisał w wiadomości
    news:h761bk$fjh$1@news.onet.pl...
    >
    > Juz wiem gdzie sa jaja. Moja klase z szablonem funkcji zaimplementowałem w
    > pliku *.dll, zas jej uzycie bylo zaimplementowane w pliku *.exe !!
    > Kiedy przenioslem uzycie funkcji szablonowej z *.exe do *.dll wszystko
    > zaczelo dzialac.

    Tylko, co teraz??



  • 16. Data: 2009-08-27 13:33:13
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Megas" <k...@o...eu> napisał w wiadomości
    news:h761ch$fn3$1@news.onet.pl...
    >
    > Użytkownik "Megas" <k...@o...eu> napisał w wiadomości
    > news:h761bk$fjh$1@news.onet.pl...
    >>
    >> Juz wiem gdzie sa jaja. Moja klase z szablonem funkcji zaimplementowałem
    >> w pliku *.dll, zas jej uzycie bylo zaimplementowane w pliku *.exe !!
    >> Kiedy przenioslem uzycie funkcji szablonowej z *.exe do *.dll wszystko
    >> zaczelo dzialac.
    >

    Ciekawe jest to, ze w sytuacji, gdy deklaracje i definicje funkcji
    szablonowej klasy A umiescilem razem w jednym pliku *.h (projektu *.dll) to
    wykorzystanie tej funkcji poza projektem *.dll nie stwarzalo zdanych
    problemów. Jesli zas, rozdzielilem deklaracje funkcji szablonowej od jej
    definicji to wykorzystanie tej funkcji poza modułem *.dll jej niemozliwe.
    Visual Studio C++ 2005 (Standard edition).

    Pozdr
    Marcin



  • 17. Data: 2009-08-27 13:51:27
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Arek (G)" <a...@b...pl>

    Megas pisze:
    > Użytkownik "Megas" <k...@o...eu> napisał w wiadomości
    > news:h761ch$fn3$1@news.onet.pl...
    >> Użytkownik "Megas" <k...@o...eu> napisał w wiadomości
    >> news:h761bk$fjh$1@news.onet.pl...
    >>> Juz wiem gdzie sa jaja. Moja klase z szablonem funkcji zaimplementowałem
    >>> w pliku *.dll, zas jej uzycie bylo zaimplementowane w pliku *.exe !!
    >>> Kiedy przenioslem uzycie funkcji szablonowej z *.exe do *.dll wszystko
    >>> zaczelo dzialac.
    >
    > Ciekawe jest to, ze w sytuacji, gdy deklaracje i definicje funkcji
    > szablonowej klasy A umiescilem razem w jednym pliku *.h (projektu *.dll) to
    > wykorzystanie tej funkcji poza projektem *.dll nie stwarzalo zdanych
    > problemów. Jesli zas, rozdzielilem deklaracje funkcji szablonowej od jej
    > definicji to wykorzystanie tej funkcji poza modułem *.dll jej niemozliwe.
    > Visual Studio C++ 2005 (Standard edition).


    Nie jestem pewien, ale może chodzi o to:
    class __declspec(dllexport)

    jak chcesz używać tego na zewnątrz to powinno być:
    class __declspec(dllimport)

    Jeśli to jest to, to zrób sobie taki myk:

    #ifdef TAKI_MYK
    #define MOJE_ROZNOSCI __declspec(dllexport)
    #else
    #define MOJE_ROZNOSCI __declspec(dllimport)
    #endif

    deklaracja klasy mogla by wyglądać tak:
    class MOJE_ROZNOSCI A....


    Natomiast do projektu dll'a do preprocessora dodajesz: TAKI_MYK.

    A.


  • 18. Data: 2009-08-27 13:55:07
    Temat: Re: szablony metod - deklaracja i definicja
    Od: Tomasz Bywalec <t...@p...dont.spam.me.o2.pl>

    Megas pisze:
    [...]
    >
    > Ciekawe jest to, ze w sytuacji, gdy deklaracje i definicje funkcji
    > szablonowej klasy A umiescilem razem w jednym pliku *.h (projektu *.dll) to
    > wykorzystanie tej funkcji poza projektem *.dll nie stwarzalo zdanych
    > problemów.

    Domyślam się że ten plik .h include'ujesz również w projektach
    korzystających z dll'ki. W takim przypadku kompilator, podczas
    kompilacji programu, zna definicje szablonu i rozwija go,
    niezależnie od tego czy w dll'ce znajdują się skompilowane
    konkretyzacje czy też nie - kompilator na tym etapie nie jest
    w stanie tego "zgadnąć".

    Ale osobiście wydaje mi się teraz, że niepotrzebnie brniemy
    w to rozwiązanie. Skoro chcesz aby w dll'ce znajdowało się
    tylko kilka konkretyzacji szablonu dla kilku typów, jednocześnie
    wyrzucając całą definicję szablonu z pliku nagłówkowego, to i tak
    ograniczasz użycie szablonu do właśnie tych kilku
    typów. W takim razie równie dobrze możesz, zamiast szablonu metody,
    zdefiniować kilka metod (o tej samej nazwie) dla kilku różnych typów
    argumentu. Jeżeli, dla zdefiniowania tych metod, wygodnie Ci jest się
    posłużyć szablonem to możesz go trzymać, najwyżej
    pod inną nazwą, w całości w pliku .cpp, albo zostawić prywatną
    deklarację w .h, a definicję w .cpp. Dodatkowo, programista korzystający
    z tej dll'ki będzie od razu wiedział dla jakich typów zdefiniowana
    jest ta metoda (w każdym razie błąd nastąpi już na etapie kompilacji
    a nie linkowania).

    Natomiast jeżeli chciałbyś jednak aby szablon działał dla różnych
    możliwych typów T to i tak definicja musi trafić do pliku nagłówkowego
    (w praktyce, na większości kompilatorów C++, nie da się tego uniknąć).
    Przypuszczam, że z pomocą "extern templates" (o ile są w Visual C++ ?)
    dałoby się ewentualnie skompilować konkretyzacje kilku typów i
    umieścić je w bibliotece .dll. Pytanie tylko czy naprawdę jest
    to gra warta świeczki ?

    Pozdrawiam,
    Tomek Bywalec


  • 19. Data: 2009-08-27 14:39:02
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Arek (G)" <a...@b...pl> napisał w wiadomości
    news:h76313$k1a$1@inews.gazeta.pl...
    >
    > jak chcesz używać tego na zewnątrz to powinno być:
    > class __declspec(dllimport)
    >
    > Jeśli to jest to, to zrób sobie taki myk:
    >
    > #ifdef TAKI_MYK
    > #define MOJE_ROZNOSCI __declspec(dllexport)
    > #else
    > #define MOJE_ROZNOSCI __declspec(dllimport)
    > #endif
    >
    > deklaracja klasy mogla by wyglądać tak:
    > class MOJE_ROZNOSCI A....
    >
    >
    > Natomiast do projektu dll'a do preprocessora dodajesz: TAKI_MYK.

    Dzieki za info - ale to juz mam zrobione i chyba nie w tym tkwi problem....



  • 20. Data: 2009-08-27 15:06:10
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Tomasz Bywalec" <t...@p...dont.spam.me.o2.pl> napisał w
    wiadomości news:h763r9$r70$1@nemesis.news.neostrada.pl...
    >
    > Ale osobiście wydaje mi się teraz, że niepotrzebnie brniemy
    > w to rozwiązanie. Skoro chcesz aby w dll'ce znajdowało się
    > tylko kilka konkretyzacji szablonu dla kilku typów, jednocześnie
    > wyrzucając całą definicję szablonu z pliku nagłówkowego, to i tak
    > ograniczasz użycie szablonu do właśnie tych kilku
    > typów. W takim razie równie dobrze możesz, zamiast szablonu metody,
    > zdefiniować kilka metod (o tej samej nazwie) dla kilku różnych typów
    > argumentu.
    Wiadomo, ze jesli sie nie da szablonem to bedzie trzeba isc na okolo -
    myslalem, ze czegos ja nie kumam.

    > Jeżeli, dla zdefiniowania tych metod, wygodnie Ci jest się
    > posłużyć szablonem to możesz go trzymać, najwyżej
    > pod inną nazwą, w całości w pliku .cpp, albo zostawić prywatną
    > deklarację w .h, a definicję w .cpp. Dodatkowo, programista korzystający
    > z tej dll'ki będzie od razu wiedział dla jakich typów zdefiniowana
    > jest ta metoda (w każdym razie błąd nastąpi już na etapie kompilacji
    > a nie linkowania).
    Czyli, jesli dobrze rozumiem, nie da sie wykonac konkretyzacji szablonu
    metody klasy widocznnej na zewnatrz, poza dll'eka? Soory, ale nie jestem
    pewien czy do konca poprawnei zrozumiałem twoje intencje, bo moze Ci chodzi
    o to, ze sie da tylko inaczej.

    >
    > Natomiast jeżeli chciałbyś jednak aby szablon działał dla różnych
    > możliwych typów T to i tak definicja musi trafić do pliku nagłówkowego
    > (w praktyce, na większości kompilatorów C++, nie da się tego uniknąć).
    Tak, to nawet nie jest mozliwe w tym samym projekcie - to definicja musi byc
    razem z deklaracja.

    > Przypuszczam, że z pomocą "extern templates" (o ile są w Visual C++ ?)
    > dałoby się ewentualnie skompilować konkretyzacje kilku typów i
    > umieścić je w bibliotece .dll. Pytanie tylko czy naprawdę jest
    > to gra warta świeczki ?
    A jak to zrobic? Skoro juz tak daleko zabrnelismy to moze dalbys rade do
    konca nam wytlumaczyc jak to zrobic - tak na przyszlosc...

    Pozdrawiam
    Marcin Olejarczyk


strony : 1 . [ 2 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: