2011-05-09 49 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

相关问题