-
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