2016-03-24 8 views
0

Ich weiß nicht, warum es abstürzt, wenn ich Klasse Vector erstellen. Bitte Hilfe. In diesem Programm möchte ich einen beliebigen Typ von Elementen zu einem Array hinzufügen. Ich benutze Eclipse mit Kreuz gcc, UbuntuStandardkonstruktor mit leeren Klammern C++ Fehler

template<typename T> 
class Vector{ 
    public: 
     Vector(); 
     void add(const T&); 
    private: 
     T *elem; 
     int cap; 
     int len; 
}; 

template<typename T> 
Vector<T>::Vector(){ 
    len = 0; 
    cap = 30; 
    elem = new T[cap]; 
} 

template<typename T> 
void Vector<T>::(const T& m){ 
    elem[len] = m; 
    len ++; 
} 

// Here I create Vector v, if I put Vector<int> v() I don't get error 
Vector<int> v; //error "undefined reference to `Vector<int>::Vector()" 
v.add(21); //error 
+1

Bitte geben Sie eine [mcve] an. – Barry

+0

@Brian Es ist sehr lustig, dass Sie nicht "sehr interessante Funktionen" verwenden. Ich kann mir das nicht einmal vorstellen :) –

+0

Der Compiler benötigt Sichtbarkeit der Template-Definitionen (sowohl die 'Vector ' Klasse und seine Member-Funktionen) an dem Punkt, wo Sie' Vector 'verwenden möchten. Separate Kompilierung und Vorlagen spielen nicht gut zusammen. Platzieren Sie die Definition der Elementfunktionen in der Kopfzeile, die die Klasse deklariert, und stellen Sie sicher, dass Sie diese Kopfzeile im Code einschließen, der die Vorlage "Vector" verwenden muss. [Dies ist keine vollständige Antwort]. – Peter

Antwort

1

Sie müssen Mitglied Funktionsdefinitionen platzieren (einschließlich Konstruktor-Definitionen) im gleichen Header in dem die Template-Klasse definiert ist.

Wie für diese Aussage

// here i create Vector v, if i put Vector<int> v() i don't get error 
Vector<int> v(); 

dann ist es eine Funktionsdeklaration, die Vector<int> Rückgabetyp hat und haben keine Parameter. Es ist keine Definition eines Objekts vom Typ Vector<int>.

Verwandte Themen