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
链接器错误即将发生,因为对于template类,定义应始终可见.要么你可以移动的所有内容vector.cc到vector.h.或者您可以简单地包括vector.cc您包含的任何地方vector.h.
旁注:
.h文件中的以下行无效:
#ifndef VECTOR__HH__
#define VECTOR__HH_
Run Code Online (Sandbox Code Playgroud)
使这两个宏类似,如VECTOR__HH.此宏用于避免多次包含文件.
在模板编程中,在 定义类模板的地方应该可以看到函数的定义.这通常是通过定义类本身内部的函数来完成的.
因此,有两种方法可以解决您的问题:
vector.cpp到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__
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1110 次 |
| 最近记录: |