2016-03-31 11 views
2

での作業中に、私はすべてのメソッドがArray.cppファイルで、次のように実装されているクラスArrayリンカエラー「に未定義の参照」テンプレート

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; 
}; 

を持っている:私がしようとした場合

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

main.cppをファイルに、このArrayクラスを使用する:

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

私は、これらのリンカエラーを取得しています:

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... 

(Arrayクラスのすべての単一メソッド用)すべてのファイルは私のcmakeファイルにあり、コンパイルする必要があります。 なぜこのリンカエラーが発生していますか?誰かが私にこのことを説明できますか?

+4

'Array.cpp'ヘッダーにすべてのテンプレート定義を入れる必要があります。テンプレートは通常のクラスのようには機能しません... – Blacktempel

+0

_ "すべてのメソッドは、Array.cppファイルで次のように実装されています。" _ Whoops –

答えて

2

テンプレートメソッドまたはクラスをcppファイルに実装することはできません。

+0

実際は可能です。しかし、それらは限られたやり方で少量の追加作業でしか使用できません。 –