2011-05-09 36 views
2

我有作業寫我自己的抽象類矢量。我做了一些代碼,但是當我嘗試編譯它時,我有錯誤。這是代碼:爲什麼要獲得鏈接器錯誤與向量?

vector.hh

#ifndef VECTOR__HH__ 
#define VECTOR__HH_ 

template<class T> class Vector { 
    int capacity_; 
    int size_; 
    T* buffer_; 

    void ensure_capacity(unsigned size); 

public: 
    Vector(int capacity=10) 
     : capacity_(capacity), size_(0), buffer_(new T[capacity]) 
    { } 

    ~Vector() { 
     delete []buffer_; 
    } 

    int size() const { 
     return size_; 
    } 

    bool empty() const { 
     return size_ == 0; 
    } 

    T& operator[](int n) { 
     return buffer_[n]; 
    } 

    const T& operator[](int n) const { 
     return buffer_[n]; 
    } 

    void clear() { 
     // TODO 
    } 

    int capacity() const { 
     return capacity_; 
    } 

    T& front() { 
     return buffer_[0]; 
    } 

    const T& front() const { 
     return buffer_[0]; 
    } 

    T& back() { 
     return buffer_[size_-1]; 
    } 

    const T& back() const { 
     return buffer_[size_-1]; 
    } 

    void push_back(const T& value); 
}; 
#endif 

vector.cc

#include "vector.hh" 

template<class T> 
void Vector<T>::ensure_capacity(unsigned size) { 
    if(capacity_>size+1) { 
     return; 
    } 

    capacity_ = capacity_ ==0?1:capacity_; 

    while(capacity_<size+1) { 
     capacity_*=2; 
    } 

    T* old_buffer = buffer_; 
    buffer_ = new T[capacity_]; 
    memcpy(buffer_, old_buffer, sizeof(T)*size_); 

    delete [] old_buffer; 
} 

template<class T> 
void Vector<T>::push_back(const T& value) { 
    ensure_capacity(size()+1); 

    buffer_[size_] = value; 
    size_++; 
    buffer_[size_] = '/0'; 
} 

main.cc

#include "vector.hh" 
#include <iostream> 
using namespace std; 

int main(int argc, char* argv[]) { 
    Vector<int> v(2); 
    v.push_back(10); 

    cout << v[0]; 

    return 0; 
} 

和錯誤是:

克++ -c -o main.o main.cc 克++ -Wall -g vector.o main.o -o hw02vector
main.o:在功能 'main'
main.cc:(.text+0x37):未定義參照 'Vector<int>::push_back(int const&)'
collect2:LD返回1個退出狀態
化妝: * [hw02vector]錯誤1 0
+2

[此問題](http://stackoverflow.com/questions/3749099/)可能會有所幫助。 – 2011-05-09 06:24:26

+1

+1實際上做了努力,並提出了一個問題,而不是簡單地要求編碼! :) – Nim 2011-05-09 08:11:50

+0

請注意,雙下劃線是爲庫執行者保留的 – 2012-02-24 15:42:15

回答

7

鏈接器錯誤來了,因爲對於template類的定義應該總是可見的。您可以將vector.cc的所有內容移動到vector.h。或者,您可以簡單地包括vector.cc,無論您在哪裏包括vector.h

側面說明

在.h文件中以下行沒有幫助:

使雙方如,VECTOR__HH類似的宏。這些宏用於避免多個文件的包含。

5

在模板編程中,函數的定義應該在定義類模板的位置可見。通常通過在類本身內定義函數來完成。

因此,有兩種方法可以解決你的問題:

  • 把所有的定義從vector.cppvector.hh(這實際上是通常的解決方法)。並刪除Vector.cpp作爲其不需要的。
  • 或者,包括vector.cpp文件在vector.hh文件的年底,Vector類模板的定義之後,就像這樣:

    #ifndef VECTOR__HH__ 
    #define VECTOR__HH__ //<--- corrected this also! 
    
    template<class T> 
    class Vector { 
        //... 
    }; 
    
    //... 
    
    #include "vector.cpp" 
    
    #endif VECTOR__HH__ 
    
+1

也存在'#define'在問題中出現的錯誤,您可以在代碼中對其進行更正。 – iammilind 2011-05-09 06:28:21

+1

非常感謝:) – 2011-05-09 06:32:01

相關問題