Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Template klasy z podziałem kodu na definicje i deklaracje

Ostatnio zmodyfikowano 2014-10-29 19:40
Autor Wiadomość
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:
C/C++
// HEADER

class Protocol
{
public:
    //.. duuzo funkcji virtualnych
};

template < typename PROTOCOL >
class Client
{
}

C/C++
// CPP

//definicje funkcji z klasy Client i na koniec to
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ł.
P-119632
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).

Frazy, które należy wpisać w wyszukiwarkę google:

Przykład podobnego tematu: http://cpp0x.pl/forum/temat/​?id=8285
P-119638
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?
P-119640
Monika90
» 2014-10-29 19:26:10
Pokaż więcej kodu. W tym co pokazałeś nie ma żadnego problemu.
P-119641
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ą.

P-119644
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ć.
P-119645
« 1 »
  Strona 1 z 1