-
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