Template klasy z podziałem kodu na definicje i deklaracje
Ostatnio zmodyfikowano 2014-10-29 19:40
Chlorek Temat założony przez niniejszego użytkownika |
Template klasy z podziałem kodu na definicje i deklaracje » 2014-10-29 18:37:48 Ogólnie wiem, że problem sam w sobie jest nierozwiązywalny z pełnym zachowaniem możliwości template'ów oraz ogólnej korzystności (jak w przypadku includowanie oddzielnego pliku pod definicję). Ale do rzeczy - dla mojego zastosowania wystarcza znać jeden typ który będzie przekazywany, jest nim inna klasa którą napisałem. Oto kod:
class Protocol { public: };
template < typename PROTOCOL > class Client { }
template class Client < Protocol >;
Dla typu int, czy nawet std::string podanego w ostatniej linijce kodu CPP wszystko działa, ale podanie Protocol powoduje wystąpienie 'undefined reference' z funkcjami klasy Client (czyli tak jak to jest zwykle gdy próbujemy normalnie napisać podzielony kod dla template'ów). #Edit Właściwie okazało się że dla jakiekolwiek klasy, która posiada już definicję (nie dla takiej której metody są wyłącznie wirtualne) i zawiera wszystkie potrzebne metody by działać jako protokół dla klasy Client wciąż wyrzuca mi undefined reference. Jakiś pomysł? Wygląda to tak jakby ten sposób (tak często pojawiający się w sieci) kompletnie nie działał. |
|
DejaVu |
» 2014-10-29 19:13:34 Deklaracja i implementacja szablonu musi być zawsze w pliku nagłówkowym (nie musi być to ten sam plik, ale musi być wciągany dyrektywą include). Przykład podobnego tematu: http://cpp0x.pl/forum/temat/?id=8285 |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-10-29 19:19:46 Bardzo nie lubię tego rozwiązania i dlatego kombinuję, jak to zrobić czyściej - chociażby właśnie tak jak próbuję. Wiele razy natknąłem się na pewien sposób, ale należy wcześniej podać z jakich typów danych będę korzystał - w teorii dla milionów ludzi działa - dla mnie nie, zero efektu. template class Klasa < int >; Taki kod teoretycznie ma zadziałać o ile chcemy używać templatu tylko dla integera. Pytanie - czy to jest normalnie dozwolone w standardzie? Czy może po prostu przeczytałem jakieś rozwiązanie dla M$ kompilatorów? Jeśli nie da się tego tak zrobić to pozostaje mi include'ować definicję. #Edit Z jednego tematu na tym forum, cytuję: Kompilator musi taki szablon skonkretyzować w danym miejscu (tam gdzie ma dostęp do definicji funkcji/klasy).
Np. template class std::vector < int >;
Metody w ten sposób nie przeciążysz (chyba że o czymś nie wiem...), ale klasę tak.
|
Więc czemu nie działa? |
|
Monika90 |
» 2014-10-29 19:26:10 Pokaż więcej kodu. W tym co pokazałeś nie ma żadnego problemu. |
|
DejaVu |
» 2014-10-29 19:37:27 Nie da się skompilować do pliku binarnego czegoś co nie jest skonkretyzowane. Nie ukryjesz implementacji szablonów w C++ przed programistą.
|
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-10-29 19:40:46 Eh... cały problem w zachowaniu kompilatora, zrobiłem pełny rebuild projektu i zadziałało. Nie do końca jak oczekiwałem (chce dziedziczyć po Protocol ale wtedy ta metoda nie przyjmie mojej klasy). Wychodzi na to, że problem nie istniał... tyle czasu stracone a wystarczyło zrobić rebuild.
#Up Wiem, że trzeba skonkretyzować i właśnie to chciałem zrobić. |
|
« 1 » |