eGospodarka.pl
eGospodarka.pl poleca

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

  • 1. Data: 2009-08-26 19:17:24
    Temat: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>

    Witam wszystkich,

    Mam problem z kompilacja kodu C++ pod Visual Studio 2005 w ktorym
    zdefiniowałem sobie szablon metody w klasie - moze ktos juz spotkal sie z
    takim problemem?

    Stworzyłem sobie biblioteke *.dll, gdzie w pliku A.h zadeklarowałem klase A
    zawierajaca szablon metody, zas w pliku A.cpp zdefiniowałem ciało tego
    szablonu:
    // plik A.h
    class __declspec(dllexport) A {
    template<typename _T>
    A& operator<<( const _T lNumer );
    };

    // plik A.cpp
    template<typename _T>
    A& A::operator<<( const _T lNumer ) {
    *pStream_ << lNumer;
    return *this;
    }
    Biblioteka *.dll poprawnie mi sie kompiluje i linkuje, jednak uzycie
    operatora<< tej klasy poza ta biblioteka (np. w pliku *.exe) powoduja blad
    linkera: error LNK2019: unresolved external symbol.

    Ale gdy tylko umieszcze deklaracje i definicje tego opertatora w tym samym
    miejscu:
    // plik A.h
    class __declspec(dllexport) A {
    template<typename _T>
    A& operator<<( const _T lNumer ){
    *pStream_ << lNumer;
    return *this;
    }
    };
    to wszystko działa poprawnie i moge z tego operatora korzystac w plikach
    *.exe bez zadnego problemu.

    Czy moze ktos wie dlaczego tak sie dzieje??

    Pozdrawiam



  • 2. Data: 2009-08-26 20:31:16
    Temat: Re: szablony metod - deklaracja i definicja
    Od: Mateusz Loskot <s...@s...net>

    Megas wrote:
    > [...]
    > Ale gdy tylko umieszcze deklaracje i definicje tego opertatora w tym samym
    > miejscu:
    > // plik A.h
    > class __declspec(dllexport) A {
    > template<typename _T>
    > A& operator<<( const _T lNumer ){
    > *pStream_ << lNumer;
    > return *this;
    > }
    > };
    > to wszystko dzia?a poprawnie i moge z tego operatora korzystac w plikach
    > *.exe bez zadnego problemu.
    >
    > Czy moze ktos wie dlaczego tak sie dzieje??

    http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.12

    Pozdrawiam
    --
    Mateusz Loskot, http://mateusz.loskot.net
    Charter Member of OSGeo, http://osgeo.org


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


    Użytkownik "Mateusz Loskot" <s...@s...net> napisał w wiadomości
    news:h7462k$4vj$1@inews.gazeta.pl...
    >
    > http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.12

    Ok. Dzieki za odpowiedz.
    Postanowilem, ze utworze na podstawie szablonu funkcji konkretne funkcje dla
    typow wbudowanych, tuz za cialem tego szablonu. Czyli: w pliku *.h
    pozostanie tylko deklaracja funkcji szablonowej (chce w ten sposob uniknac
    nadmiernych includów w *.h), definicje funkcji szablonowej umieszcze w pliku
    *.cpp, zas zaraz za definicja tej funkcji umieszcze definicje konkretnych
    funkcji dla typow wbudowanych. Ogolna konstrukcja jest taka:

    // plik A.cpp
    using namespace N1:N2:N3;

    template<typename _T>
    A& A::operator<<( const _T lNumer ) {
    *pStream_ << lNumer;
    return *this;
    }

    template A& A::operator<<<long>(long);

    Niestety, kompilator nadal pokazuje mi, ze nie moze odnalezc operator<< dla
    typu long - nie wiem co jest? Ponownie, gdy wprowadze cialo funkcji
    szablonowej do jej deklaracji w pliku *.h wsio jest ok - DLACZEGO? Moze zle
    definiuje operator na podstawie szablonu?

    Pozdrawiam
    Marcin



  • 4. Data: 2009-08-27 11:20:22
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Mateusz Loskot" <m...@l...net>

    "Megas" <k...@o...eu> wrote in message news:h75on2$kj2$1@news.onet.pl...
    >
    > U?ytkownik "Mateusz Loskot" <s...@s...net> napisa? w wiadomo?ci
    > news:h7462k$4vj$1@inews.gazeta.pl...
    >>
    >> http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.12
    >
    > Ok. Dzieki za odpowiedz.
    > Postanowilem, ze utworze na podstawie szablonu funkcji konkretne funkcje
    > dla typow wbudowanych, tuz za cialem tego szablonu. Czyli: w pliku *.h
    > pozostanie tylko deklaracja funkcji szablonowej (chce w ten sposob uniknac
    > nadmiernych includ?w w *.h), definicje funkcji szablonowej umieszcze w
    > pliku *.cpp, zas zaraz za definicja tej funkcji umieszcze definicje
    > konkretnych funkcji dla typow wbudowanych. Ogolna konstrukcja jest taka:
    >
    > // plik A.cpp
    > using namespace N1:N2:N3;
    >
    > template<typename _T>
    > A& A::operator<<( const _T lNumer ) {
    > *pStream_ << lNumer;
    > return *this;
    > }
    >
    > template A& A::operator<<<long>(long);

    http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.7

    Pozdrawiam
    --
    Mateusz Loskot, http://mateusz.loskot.net
    pl.comp.lang.c FAQ: http://pl.cpp.wikia.com/wiki/FAQ
    C++ FAQ: http://parashift.com/c++-faq-lite


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


    Użytkownik "Mateusz Loskot" <m...@l...net> napisał w wiadomości
    news:h75q1r$53e$1@inews.gazeta.pl...
    >
    > http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.7

    Mateusz, w punkcie 35.7 jest opisany sposob definiowania specjalizacji
    funkcji wobec jej szablonu (zdefiniowanie innej implementacji funkcji wobec
    domyslnego szablonu) - i to jest jasne. Ale ja chce zmusic kompilator by
    wygenerowal konkretna funkcje na podstawie szablonu w tym miejscu, tak bym
    pozniej mogl z niej juz skorzystac w innym miejscu. Robie to tak:

    template A& A::operator<<<long>(long);

    Ale nie działa - pomoz prosze....



  • 6. Data: 2009-08-27 11:43:47
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Mateusz Loskot" <m...@l...net>

    "Megas" <k...@o...eu> wrote in message news:h75qo4$qp7$1@news.onet.pl...
    >
    > U?ytkownik "Mateusz Loskot" <m...@l...net> napisa? w wiadomo?ci
    > news:h75q1r$53e$1@inews.gazeta.pl...
    >>
    >> http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.7
    >
    > Mateusz, w punkcie 35.7 jest opisany sposob definiowania specjalizacji
    > funkcji wobec jej szablonu (zdefiniowanie innej implementacji funkcji
    > wobec domyslnego szablonu) - i to jest jasne. Ale ja chce zmusic
    > kompilator by wygenerowal konkretna funkcje na podstawie szablonu w tym
    > miejscu, tak bym pozniej mogl z niej juz skorzystac w innym miejscu. Robie
    > to tak:
    >
    > template A& A::operator<<<long>(long);

    To jest błąd!

    Jak chcesz wygenerować specjalizacje, to robisz to explicite
    samodzielnie:

    #include <iostream>

    struct T
    {
    template <typename T>
    std::ostream& operator<<(T x)
    {
    std::cout << "<T>: " << x << std::endl;
    return std::cout;
    }

    template <>
    std::ostream& operator<< <int>(int x)
    {
    std::cout << "<int>: " << x << std::endl;
    return std::cout;
    }

    template <>
    std::ostream& operator<< <double>(double x)
    {
    std::cout << "<double>: " << x << std::endl;
    return std::cout;
    }
    };

    int main()
    {
    T t;
    t << long(7);
    t << int(7);
    t << double(7);
    return 0;
    }

    Pozdrawiam
    --
    Mateusz Loskot, http://mateusz.loskot.net
    pl.comp.lang.c FAQ: http://pl.cpp.wikia.com/wiki/FAQ
    C++ FAQ: http://parashift.com/c++-faq-lite


  • 7. Data: 2009-08-27 11:45:53
    Temat: Re: szablony metod - deklaracja i definicja
    Od: "Megas" <k...@o...eu>


    Użytkownik "Mateusz Loskot" <m...@l...net> napisał w wiadomości
    news:h75rdr$bsq$1@inews.gazeta.pl...
    > "Megas" <k...@o...eu> wrote in message
    > news:h75qo4$qp7$1@news.onet.pl...
    >>> http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.7
    >>
    >> Mateusz, w punkcie 35.7 jest opisany sposob definiowania specjalizacji
    >> funkcji wobec jej szablonu (zdefiniowanie innej implementacji funkcji
    >> wobec domyslnego szablonu) - i to jest jasne. Ale ja chce zmusic
    >> kompilator by wygenerowal konkretna funkcje na podstawie szablonu w tym
    >> miejscu, tak bym pozniej mogl z niej juz skorzystac w innym miejscu.
    >> Robie to tak:
    >>
    >> template A& A::operator<<<long>(long);
    >
    > To jest błąd!
    >
    > Jak chcesz wygenerować specjalizacje, to robisz to explicite
    > samodzielnie:

    Tyle, ze ja nie chce wykonac specjalizacji funkcji - ja chce zmusic tylko
    kompilator by wygenerowal w tym miejscu funkcje na podstawie szablonu. punkt
    http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.13 jak uniknac
    link error.



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

    Megas pisze:
    [...]
    >
    > Tyle, ze ja nie chce wykonac specjalizacji funkcji - ja chce zmusic tylko
    > kompilator by wygenerowal w tym miejscu funkcje na podstawie szablonu. punkt
    > http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.13 jak uniknac
    > link error.
    >
    >

    A czy czasem nie zapomniałeś dodać słowo kluczowe "extern" w deklaracji
    szablonu funkcji w nagłówku? (tak jak jest w faq) U mnie działa pod VC++
    2008 EE.

    Pozdrawiam,
    Tomek Bywalec


  • 9. Data: 2009-08-27 12:26:04
    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:h75tgd$snb$1@atlantis.news.neostrada.pl...
    > Megas pisze:
    > [...]
    >>
    >> Tyle, ze ja nie chce wykonac specjalizacji funkcji - ja chce zmusic tylko
    >> kompilator by wygenerowal w tym miejscu funkcje na podstawie szablonu.
    >> punkt http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.13 jak
    >> uniknac link error.
    >
    > A czy czasem nie zapomniałeś dodać słowo kluczowe "extern" w deklaracji
    > szablonu funkcji w nagłówku? (tak jak jest w faq) U mnie działa pod VC++
    > 2008 EE.
    >

    Po dodaniu slowa extern do deklaracji funkcji skladowej klasy mam blad
    kompilatora VC++ 2005 :
    error C2720: 'A::operator <<' : 'extern' storage-class specifier illegal on
    members



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


    Użytkownik "Megas" <k...@o...eu> napisał w wiadomości
    news:h75on2$kj2$1@news.onet.pl...
    >
    > Użytkownik "Mateusz Loskot" <s...@s...net> napisał w wiadomości
    > news:h7462k$4vj$1@inews.gazeta.pl...
    >>

    http://www.parashift.com/c++-faq-lite/templates.html
    #faq-35.12
    W punkcie 35.12 mozna znalezc informacje jak uniknac bledu linkowania
    szablonu funkcji zdefiniowanej i zadeklarowanej w roznych plikach:

    The other solution is to leave the definition of the template function in
    the .cpp file and simply add the line template void foo<int>(); to that
    file:

    // File "foo.cpp"
    #include <iostream>
    #include "foo.h"

    template<typename T> void foo()
    {
    std::cout << "Here I am!\n";
    }

    template void foo<int>();

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

    Pozdrawiam


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: