Muszę przyznać, że była zażarta i obie strony nie chciały łatwo dać adwersarzowi za wygraną. Jako, że przeciwko reżimowi monopolu oraz niczym nieuzasadnionej i beztroskiej zmiany w linkerze Visual Studio (jak narazie niepojętej) stały trzy potęgi w postaci FLOSS, Justina (tak, właśnie tego), oraz mojej skromnej osoby, przeciwnik zaczął tracić grunt pod stopami z każdą kolejną kompilacją.
Wpierw na pole bitwy wprowadziliśmy piechotę, i bawiliśmy się z przeciwnikiem w podchody. Podrzucaliśmy mu gotowe, pliki źródłowe (szpiegów) bezpośrednio do jego źródeł zaopatrzenia (obozu ulokowanego na wzgórzu psi/src), lecz przeciwnik niewzruszony naszymi wyczynami, kwitował je zwykłym i ordynarnym error LNK2019: unresolved external symbol – co za bezczelność! W momencie, gdy my przestrzegaliśmy wszystkich konwencji wojennych (całkowicie poprawny kod itp.).
Wobec nieustępliwości wroga, w tajnym porozumieniu poprzez super-tajną sieć zwaną przez niektórych Jabberem, zwołaliśmy nadzwyczajne zebranie (przerwane na godzinę przez fałszywy alarm przeciwpożarowy w budynku, gdzie przebywał jeden z uczestników obrad), i ustaliliśmy słaby punkt przeciwnika. Jego problem polegał na tym, że kompilatorowi nie podobało się dziedziczenie szablonowej klasy przez klasę nieszablonową. Zaszliśmy więc przeciwnika od tyłu, obchodząc jego zabezpieczenia (likwidacja klasy dziedziczonej i przepisanie jej kodu do klas dziedziczących, na szczęście nie tak aż dużo). Ostateczny cios zadano zdecydowanie, choć lekko nieprecyzyjnie (mea culpa) ;), przez co wykończenie drania zajęło nam kilka minut więcej, ale padł ! padł moloch przed naszymi stopami… HaHaHa!
Po zwycięzkiej bitwie, pogadaliśmy sobie jeszcze chwilę na temat dalszych planów na życie jednego z uczestników bitwy przy kufelku dobrego piwa, pożyczyłem szczęścia na dalszej drodze kariery (btw: w jego planach wykryłem efekt deja’vu … 🙂 ) … a następnie, w zależności od strefy czasowej każdego osobnika, udaliśmy się czynić swoją powinność. Mnie przypadło przespanie się choć kilku godzin, życzę więc Wam teraz dobranoc.
A nie łatwiej było zrobić z klasy pochodnej template, który miałby jakąśtam statyczną prywatną zmienną szablonowaną?
Czyli zamiast:
template<typename T> class A { /*..*/};
class B: public A { /*..*/ };
było by:
template<typename T> class A { /*..*/};
template<typename T> class B_: public A { /*..*/ private: static T dummy;};
typedef B_<int> B;
W ten sposób nie tracisz zalet dziedziczenia a oszukujesz głupawy kompilator.
A co więcej: można porobić kompilację warunkową, która dla porządnego kompilatora wygeneruje kod bez kombinowania.
A tak swoją drogą: czy można mieć szablon i nigdzie nie wykorzystać parametru?
A… i jeszcze coś: właśnie zauważyłem, że w moim super wywodzie trzeba było użyć A<cośtam>. Ale idea pozostaje ta sama.
Kiedyś też będę taki mądry jak Wy i będę wiedział o co chodzi ;D
Machekku: da się mieć szablon i nie korzystać z parametru. Wystarczy nawet nie nazywać parametru.
To kompilacja Psi w/ QCA powiodła się ostatecznie pod VC++.NET2003 czy nie? Bo jeśli nie, to do rozgrywek może włączyć się zawodnik pt. michalj. 🙂
Nie powiedzie się, o ile będzie linkowane QCA dynamicznie, a nie, jak do tej pory, statycznie.
Patryk, ale może podziel się jakimiś praktycznie stosowalnymi rezultatami, co? 🙂