Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Nicht aufgelöste Symbole und Templates

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.04.2005, 12:06 Uhr
Oliver
S2-Pixelgeneral


Hi,

ich hab ne Klass für Vectoren bzw. Arrays, die so aussieht:


C++:
namespace ex
{
    template <class T>
    class Vector
    {
        private:
            
            T * m_data;
            unsigned m_elements;
            
        public:
            
            Vector();
            Vector(const unsigned elements);
            Vector(const Vector<T>& arr);
            
            ~Vector();
            
            T& operator[](const unsigned i){return m_data[i];}
            const T& operator[](const unsigned i) const{return m_data[i];}
            const T* GetData() const { return m_data; }
            unsigned GetSize() const { return m_elements; }
            
            void Resize(const unsigned elements);
            void ForAll(void (*fp)(T& element));
    };
};



So der Code befindet sich in einem Headerfile, der Ausschnitt ( Konstruktore und Destruktore lasse ich jetzt mal weg, die stehen da auch noch mit drinnen) befindet sich in einer normalen Quelldatei:


C++:
#include "olib.h"
// [...]
template <class T>
void ex::Vector<T>::Resize(const unsigned elements)
{
    if(m_data) delete[]m_data;
    m_elements=elements;
    m_data=new T[elements];
}

template <class T>
void ex::Vector<T>::ForAll(void (*fp)(T& element))
{
    for(unsigned i=0;i<m_elements;++i)
        fp(m_data[i]);
}



Schließlich gibts noch ne main.cpp als Test:


C++:
#include <iostream>
#include "olib.h"

using namespace std;


int main()
{
    ex::Vector<int> vec(4);
    vec.Resize(10);
    
    cin.get();
    return 0;
}



Das Problem ist, dass wenn ich das ganze linke, nicht aufgelöste Symbole
für alle nicht-inline Funktionen kommen:


Fehler:

[Linker error] undefined reference to `ex::Vector<int>::Vector(unsigned int)'
[Linker error] undefined reference to `ex::Vector<int>::Resize(unsigned int)'
usw.



Muss irgendwie an den Templates liegen (ich mach selten was mit denen), hab noch ne weitere Klasse ohne Templates in den gleichen Dateien und da gehts. Woran soll das liegen (MinGW)?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.04.2005, 12:23 Uhr
Spacelord
Hoffnungsloser Fall


Pack mal die Templatedefinitionen mit in den Header.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.04.2005, 13:18 Uhr
Oliver
S2-Pixelgeneral




Es geht. Aber wenn jetzt 2 Dateien habe, die meinentwegen einen Vector<int> haben, haben ja beide Dateien ein- und dieselbe Funktion. Kann man das verhindern. Oder denk ich grad total falsch?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.04.2005, 15:20 Uhr
Spacelord
Hoffnungsloser Fall


Also soweit ich weiß,bläht man dadurch die erzeugten Object Files auf.Der Linker sorgt dann aber dafür dass es für jeden Datentyp wirklich nur eine konkrete Instanzierung des Templates gibt.Da kann dir beefy sicherlich mehr zu sagen .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.04.2005, 08:30 Uhr
doppler



Soweit ich weiß, verhindert das Schlüsselwort inline, dass es zu Binder-Fehlern kommt, wenn man das Header-File in mehrere Bibliotheken einbindet. Definitionen von class-members werden automatisch inline gemacht. Wenn du aber eine Template-Funktion definieren willst, musst du das inline explizit angeben (das ganze bezieht sich auf den gcc, wie es bei anderen Compilern/Linkern ist, weiß ich leider nicht).

Um eine template-Definition in eine .cpp-Datei zu schreiben, muss man das Schlüsselwort export verwenden. Dieser Mechanismus ist bisher allerdings nur bei wenigen Compilern implementiert (gcc nicht).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: