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

矢量.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';
}

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

错误是:

g++ -c -o main.o main.cc
g++ -Wall -g vector.o main.o -o hw02vector
main.o:在函数中'main': main.cc:(.text+
0x37):对collect2的未定义引用'Vector<int>::push_back(int const&)'
:ld返回1 退出状态
make: * [hw02vector] 错误 1

4

2 回答 2

7

链接器错误即将到来,因为对于template类,定义应该始终可见。您可以将所有内容vector.cc移入vector.h. 或者你可以简单地包括vector.cc你包括的任何地方vector.h

旁注

.h 文件中的以下行无济于事:

#ifndef VECTOR__HH__
#define VECTOR__HH_

使两个宏都相似,例如,VECTOR__HH. 此宏用于避免多次包含文件。

于 2011-05-09T06:21:37.480 回答
5

在模板编程中,函数的 定义应该在定义类模板的地方可见。这通常是通过在类本身内部定义函数来完成的。

因此,有两种方法可以解决您的问题:

  • 将所有定义从vector.cppto移动vector.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__
    
于 2011-05-09T06:19:55.390 回答