Szablony klas, nagłówki i include

Odpowiedz Nowy wątek
2014-08-26 11:39

Rejestracja: 13 lat temu

Ostatnio: 8 godzin temu

0

Potrzebuję zrobić szablon klasy, żeby nie robić wielu identycznych klas różniących się typem danych.

Utworzyłem dwie testowe klasy:

szablontest1.h

#ifndef SZABLONTEST1_H
#define SZABLONTEST1_H

template <class T>
class SzablonTest1
{
private:
    T Buf[10];

public:
    SzablonTest1();
    void Wczytaj(int N, T Val);
    T Pobierz(int N);
};

#endif // SZABLONTEST1_H

szablontest1.cpp

#include "szablontest1.h"

template <class T>
SzablonTest1<T>::SzablonTest1()
{
}

template <class T>
void SzablonTest1<T>::Wczytaj(int N, T Val)
{
    Buf[N] = Val;
}

template <class T>
T SzablonTest1<T>::Pobierz(int N)
{
    return Buf[N];
}

szablontest2.h

#ifndef SZABLONTEST2_H
#define SZABLONTEST2_H

template <class T>
class SzablonTest2
{
private:
    T Buf[10];

public:
    SzablonTest2()
    {
    }

    void Wczytaj(int N, T Val)
    {
        Buf[N] = Val;
    }

    T Pobierz(int N)
    {
        return Buf[N];
    }
};

#endif // SZABLONTEST2_H

szablontest2.cpp

#include "szablontest2.h"

Wiadomo, że prawidłowo, to w pliku .h podaje się pola klasy i deklaracje metod, a w pliku .cpp implementuje się metody. Używam QtCreator z kompilatorem MinGW. Dla zwykłych klas nie ma problemu, natomiast do szablonu jest problem z kompilacją.

Próbuję skompilować taki kod.

    SzablonTest1<int> ST1;
    ST1.Wczytaj(0, 27);
    cout << ST1.Pobierz(0) << endl;

    SzablonTest2<int> ST2;
    ST2.Wczytaj(0, 27);
    cout << ST2.Pobierz(0) << endl;

Jeżeli w pliku zrobię include szablontest1.h i szablontest2.h, to przy metodach z SzablonTest1 pojawia się błąd "undefined reference to `SzablonTest1<int>::SzablonTest1()'", podobnie dla wszystkich 3 metod.

Jak zrobię include szablontest1.cpp i szablontest2.h, co jest co najmniej dziwne, bo prawidłowo, to się dołącza pliki .h, a nie .cpp, to program kompiluje się i działa poprawnie.

Gdzie jest błąd i jak prawidłowo utworzyć szablon klasy SzablonTest1 tak, że po include pliku .h program kompiluje się i działa poprawnie?

edytowany 2x, ostatnio: andrzejlisek, 2014-08-26 11:41

Pozostało 580 znaków

2014-08-26 11:45
Moderator

Rejestracja: 16 lat temu

Ostatnio: 3 godziny temu

0

Bo generalnie nie da się tak robić z szablonami.
http://www.parashift.com/c++-[...]from-decl-export-keyword.html
Niby jest słowo kluczowe które miało to załatwić, ale chyba nie wszystkie kompilatory to implementują. Musisz wepchnać cały kod do nagłówka i nie kombinowac :P


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2014-08-26 11:46
export zostało usunięte już w C++11. Miały to tylko kompilatory oparte o frontend EDG (np. ICC). - Endrju 2014-08-26 12:27

Pozostało 580 znaków

2014-08-26 12:03

Rejestracja: 17 lat temu

Ostatnio: 3 lata temu

Lokalizacja: Kielce

0

szablon zawsze pchaj w nagłówek wraz z implementacją. niestety taki fail z szablonami.


HAKGER - 50% Complete

Pozostało 580 znaków

kq
2014-08-26 12:26
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 49 sekund temu

Lokalizacja: Szczecin

0

By​ć może C++17 rozwiąże to modułami. Na razie najlepsze co możesz zrobić to dwa pliki nagłówkowe¹ (i wybrać konwencję, np. szablon_fwd.h i szablon.h lub szablon.h i szablon_impl.h) i rozbić Twój szablon na deklaracje i definicje tak jakbyś to robił z plikami .cpp. Ale w miejscu użycia i tak będziesz potrzebował pełnego kodu szablonu.

¹ tak poleca np. Herb Sutter: http://herbsutter.com/gotw/_101/


myślisz że moduły wejdą? Fajne toto i by przyśpieszyły kompilacje nieźle, szczególnie przy dużych projektach... - Johnny_Bit 2014-08-26 12:30
Mam ogromną nadzieję, że wejdą. A jak będzie... zobaczymy. - kq 2014-08-26 12:35
jest gdzieś opis jak miałaby wyglądać składnia tych modułów? - Azarien 2014-08-26 13:16
@Azarien - twórcy clanga nad tym pracują z tego co pamiętam. zaraz dam info, znajdę tylko na dysku... iii nie muszę szukać bo @kq dał ;) ale jeszcze widziałem jedną prezentacje pokazującą tak na żywca czemu toto fajne i jaką miłą składnie ma... - Johnny_Bit 2014-08-26 13:22
http://www.open-std.org/jtc1/[...]21/docs/papers/2012/n3347.pdf - o ile wiem potem skoncentrowali się na C++14 i nie ruszali propozycji dla 17. I w clangu jest referencyjna implementacja, ale niespecjalnie sobie radzi z C++: http://clang.llvm.org/docs/Modules.html - kq 2014-08-26 13:22

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0