首页 新闻 搜索 专区 学院

类模板多文件结构,无法解析外部符号

0
悬赏园豆:20 [已解决问题] 解决于 2017-07-04 10:16

Vector.h:

#include<iostream>
using namespace std;
const int DEFAULT_CAPACITY=20;
template <typename T>
class Vector
{
public:
    Vector(int capacity=DEFAULT_CAPACITY,int size=0,T const& e=0);
    void insert(int i,T const& e);//固定位置插入数据;
    void remove(int i);//删除指定位置数据;
    T& operator[](int i);//重载[]运算符;
    void append(T const& e);//末尾追加数据;
    int size();//获取向量大小;
    void print();//输出所有数据;
    int search(T data){//搜索指定数据;返回索引;
        for(int i=0;i<_size;i++){
            if(elem[i]==data){
            return i;
            }
        }
        return -1;
    }
protected:
    void expend();
    void shrink();
private:
    T *elem;
    int capacity;
    int _size;
};

Vector.cpp

#include"stdafx.h"
#include"Vector.h"
template <typename T> Vector<T>::Vector(int capacity,int size,const T& e){
    this->capacity=capacity;
    elem=new T[capacity];
    this->_size=size;
    for(int i=0;i<_size;i++){
    elem[i]=e;
    }
}
template<typename T> void Vector<T>::insert(int i,T const& e){
    expend();
    for(int j=_size;j>i;j--)
        elem[j]=elem[j-1];
    elem[i]=e;
    _size++;
}
template<typename T> void Vector<T>::remove(int rank){
    for(int i=rank;i<_size-1;i++){
    elem[i]=elem[i+1];
    }
    _size--;
    shrink();
}
template<typename T> T& Vector<T>::operator[](int i){
    return elem[i];
}
template<typename T>void Vector<T>::append(T const& e){
    expend();
    insert(_size,e);
}
template<typename T>int Vector<T>::size(){
    return _size;
}
template<typename T>void Vector<T>::print(){
    for(int i=0;i<_size;i++){
    cout<<"[ "<<i<<" ]"<<ends<<elem[i]<<endl;
    }
}
template<typename T>void Vector<T>::expend(){
    if(_size<capacity) return;
    if(capacity<DEFAULT_CAPACITY) capacity=DEFAULT_CAPACITY;
    T*oldElem=elem;
    elem=new T[capacity<<=1];
    for(int i=0;i<_size;i++){
        elem[i]=oldElem[i];
    }
    delete[]oldElem;
}
template<typename T>void Vector<T>::shrink(){
    if(_size*4>capacity)return;
    T*oldElem=elem;
    elem=new T[capacity>>=1];
    for(int i=0;i<_size;i++){
        elem[i]=oldElem[i];
    }
    delete[]oldElem;
}

main.cpp

#include "stdafx.h"
#include"Vector.h"
int main()
{

    Vector<int> a;
    a.append(1);
    a.print();
    return 0;
}

编译错误:

C++
问题补充:

麻烦大神看下吧,搜了很多,不知道哪里的问题

lif323的主页 lif323 | 初学一级 | 园豆:114
提问于:2017-05-16 20:44
< >
分享
最佳答案
0

好像是因为类模板的声明与定义不能分开,你可以试试在main.cpp中加上#include <Vector.cpp>或者将Vector.h和Vector.cpp中的代码放在同一个文件中。

收获园豆:20
安月月 | 菜鸟二级 |园豆:222 | 2017-06-07 15:23

是的,已经试验过了,多谢

lif323 | 园豆:114 (初学一级) | 2017-06-07 21:55
其他回答(1)
0

类模板不支持分离编译

lif323 | 园豆:114 (初学一级) | 2017-05-16 21:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册