CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [Rad Studio XE2] Problem z szablonem funkcji

[Rad Studio XE2] Problem z szablonem funkcji

dział ogólny

[Rad Studio XE2] Problem z szablonem funkcji

Nowy postprzez g00se » wtorek, 29 stycznia 2013, 15:19

Witam. Mam problem z ogarnięciem szablonów funkcji. Otóż mam klasę TestClass, która NIE JEST szablonem. Klasa ta posiada jedną funkcję-szablon. Nagłówek:
KOD cpp:     UKRYJ  
class TestClass
{
        public:
                __fastcall TestClass();
                __fastcall ~TestClass();

                template <class T>
                void SetParameter(String _key, T _value);

                String GetKey();
                String GetValue();
        private:
                String Key;
                String Value;
};


Oraz mam implementację, która przypisuje wartości. Nic wielkiego. W głównym pliku mam wywołanie:

KOD cpp:     UKRYJ  
        TestClass example;
        vector<TestClass> myVector;

        example.SetParameter<int>("Key 1", 12);
        myVector.push_back(example);


Problem w tym, że dostaję komunikat z kompilatora:

[ILINK32 Error] Error: Unresolved external 'void TestClass::SetParameter<int>(System::UnicodeString, int)' referenced from C:\DOC...


Nie wiem za bardzo gdzie namieszałem i dlaczego ten kawałek kodu nie działa...
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows XPChrome

Re: [Rad Studio XE2] Problem z szablonem funkcji

Nowy postprzez polymorphism » wtorek, 29 stycznia 2013, 15:48

Gdzie dałeś implementacje SetParameter? Szablony, z wyjątkiem pełnych specjalizacji, muszą być zdefiniowane w plikach nagłówkowych.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [Rad Studio XE2] Problem z szablonem funkcji

Nowy postprzez g00se » wtorek, 29 stycznia 2013, 16:09

Fakt, implementacje funkcji SetParameter dałem do pliku .cpp. Dlaczego nie można funkcji szablonowych implementować tak jak normalnych funkcji?
Avatar użytkownika
g00se
Bladawiec
Bladawiec
 
Posty: 12
Dołączył(a): poniedziałek, 7 stycznia 2013, 09:41
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: - Windows XP SP3
Kompilator: - Visual Studio 2008
- Rad Studio XE2
Gadu Gadu: 0
    Windows XPChrome

Re: [Rad Studio XE2] Problem z szablonem funkcji

Nowy postprzez polymorphism » wtorek, 29 stycznia 2013, 18:55

To wynika ze sposobu w jaki kompilowany jest projekt. Podczas kompilacji kompilowane są pliki CPP, do nich dołączane są nagłówki. Załóżmy, że w a.cpp masz metodę szablonową, w b.cpp masz gdzieś w kodzie wywołanie metody SetParameter. Przy kompilacji pliku a.cpp kompilator tylko częściowo skompiluje tę metodę (prekompilacja), ponieważ nie jest ona skonkretyzowana, czyli nie wiadomo dla jakiego parametru miałaby być wygenerowana binarka. Z kolei w pliku b.cpp następuje konkretyzacja szablonu poprzez wywołanie SetParameter, tylko problem w tym, że nie ma nigdzie definicji tej metody. Jak by była w nagłówku dołączonym do pliku, nie byłoby problemu, a tak - d.u.p.a.

Do pliku CPP możesz dać jedynie pełne specjalizacje metod, czyli np.:
KOD cpp:     UKRYJ  
template <> void TestClass::SetParameter<int>(String _key, int _value)
{
    ...
}

pod warunkiem oczywiście, że w nagłówku zdefiniowana jest wersja szablonowa.


p.s. to się odnosi do standardu z '98 roku. Nie wiem, czy w obecnym coś się zmieniło w tej kwestii. Wiem, że coś tam było ze słówkiem export, ale nie wiem, czy weszło to w końcu do standardu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 46 gości

cron