为什么用向量获取链接器错误?

nya*_*nev 2 c++ stl linker-errors c++-standard-library

我有作业写自己的抽象类Vector.我做了一些代码,但是当我尝试编译它时,我有错误.这是代码:

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
Run Code Online (Sandbox Code Playgroud)

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';
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

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

iam*_*ind 7

链接器错误即将发生,因为对于template类,定义应始终可见.要么你可以移动的所有内容vector.ccvector.h.或者您可以简单地包括vector.cc您包含的任何地方vector.h.

旁注:

.h文件中的以下行无效:

#ifndef VECTOR__HH__
#define VECTOR__HH_
Run Code Online (Sandbox Code Playgroud)

使这两个宏类似,如VECTOR__HH.此宏用于避免多次包含文件.


Naw*_*waz 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__
    
    Run Code Online (Sandbox Code Playgroud)