2016-03-31 7 views
2

ich eine Klasse Array„undefined Verweis auf“ Linker-Fehler beim Arbeiten mit Vorlagen

template <typename T> 
class Array : public SequentialContainer<T>{ 
public: 
    Array(Int size){local_vector.reserve(size);} 
    Array(std::initializer_list<T> initializer_list){ 
     local_vector.assign(initializer_list); 
    } 
    virtual Boolean contains(T &object) const; 
    virtual Boolean contains(Container<T> &container) const; 
    virtual Int size() const; 
    virtual T &operator[](Int idx); 
    virtual T &get(Int idx); 
    virtual void set(Int idx, const T &object); 
    virtual Int indexOf(T &object); 
    virtual Iterator<T> iterator() const; 
}; 

Alle Methoden implementiert werden, wie dies in der Array.cpp Datei:

template <typename T> 
Boolean Array<T>::contains(T &object) const { 
//code 
} 

Wenn ich versuche, diese Array-Klasse in einer main.cpp-Datei zu verwenden:

Array<int> c = {1, 2, 3, 4, 5, 6}; 
std::cout << c.[4] <<std::endl; 

ich diese Linker Fehler bin immer:

undefined reference to `Array<int>::iterator() const' 
undefined reference to `Array<int>::contains(int&) const' 
undefined reference to `Array<int>::contains(Container<int>&) const' 
etc... 

für jede einzelne Methode der Array-Klasse. Alle Dateien befinden sich in meiner cmake-Datei und sollten kompiliert werden. Warum bekomme ich diesen Linkerfehler? Könnte mir das bitte jemand erklären?

+4

'Array.cpp' müssen Sie alle Template-Definitionen in der Kopfzeile setzen. Vorlagen funktionieren nicht wie normale Klassen ... – Blacktempel

+0

_ "Alle Methoden sind so in der Array.cpp-Datei implementiert:" _ Whoops –

Antwort

2

Sie können die Schablonemethode oder -klasse nicht in einer cpp-Datei implementieren. Versuchen Sie dies in einem Header zu tun

+0

Eigentlich können Sie. Sie können dann aber nur begrenzt und mit einer kleinen Menge zusätzlicher Arbeit genutzt werden. –