Posted By: Neuromancer (... bright eyes ...) on 'CZprogram' Title: Re: templaty Date: Tue Jan 20 10:10:21 2004 Zdar, ok, mrkl jsem se na to, takze tady jsou casti celkoveho kodu (zkompiluje se a predpokladam, ze dela co jsi chtel, ale nevim, jak se ti bude libit). template <int Ti> class C0int { public: enum { di = Ti }; //static const int di = Ti; }; Stare MSVC nebere class konstanty, bezne reseni je pouziti enumu, jako jsem to udelal vyse. template <typename R> class C1vret { public: template <typename T0> R f(T0 a0) { return (R)a0; } }; template <> class C1vret<void> { public: template <typename T0> R f(T0 a0) { return (R)a0; } }; MSVC6 neumi castecne specializace sablon, pouze uplne. Resenim tedy je bud udelat uplne specializace pro vsechny pripady R,T0, ktere pripadaj v uvahu, nebo to v nekterych pripadech implementovat pomoci zanorenych sablon jako ja vyse (pouzil jsem uvnitr sablonu funkce, ale zrovna tak bys mohl pouzit zanorenou tridu). C2ref - ta cast s referenci neprojde. MSVC6 nerozlisuje pri definici sablon T a T&. Jestli to chces nejak obejit, mrkni na zdrojaky BOOSTu, tusim to tak bylo nejakym hackem resene. C3out - tu externi definici metody jsem nerozchodil, porad se mu neco nezdalo. Nicmene obecne ta syntax vypada takto: template <typename T0, typename TB> C4B<TB> *C4A<T0>::f(TB*) { return new C4B<TB>; } (sorry ze jsem pouzil c4b, tu c3out uz jsem si smazal). Tj. misto, abys spravne napsal template<> 2x po sobe, musis to dat dohromady. Nicmene projde to jen nekdy (tu funkci u C4B jsem take nerozchodil, musel jsem ji dat inline. template <typename T0> class C4A { public: template <typename TB> C4B<TB> *f(TB*) { return new C4B<TB>; }; }; MSVC6 nesezere explicitni specifikaci parametru u templated funkce (jako jsi pouzil ty, c4a.f<double>(...) ). Musi si zvladnout odvodit parametry sam. Muzes tudiz pouzit vyse uvedeneho triku a pak tu funkci volat takto: c4a.f( (double*)0 ); Pokud nepotrebujes volat funkci pres instanci, je alternativou pouzit zanorene tridy a staticke funkce, jako napriklad takto: template <typename T0> class C5{ public: template <typename TA> class C5i{ public: static C4A<TA>* f() { return new C4A<TA>; } }; }; A pak volani: C5<short>::C5i<double>::f(); (hodi se dat tomu C5i nejake lepsi jmeno, aby ten zapis daval alespon trochu smysl). Mno, takze jak jsem rikal, rozchodit to jde, ale s obtizema. Obcas se to vyplati (mam udelane sablony na univerzalni type-safe callbacky a zkompiluji se mi i pro MSVC6, i kdyz jsem v nich nerozchodil vse co jsem puvodne chtel), nicmene pokud mas moznost, zkus ignorovat vse od M$ pres .net2003, usetris si tim hodne nervu. P.S. url na boost je tu: http://www.boost.org/ Velka cast se korektne zkompiluje i pod MSVC6 za coz pred autory smekam... --------------------------------------------------------------------/ | ICQ 20529980 Neuromancer | | Take me far away, where the dragons fly, | /------------ leave me to my dreams, or just let me die. ------------