【已解决】重载下标运算符后出现编译错误

按照教程想实现一个自定义的Vector类,重载了[]之后进行调用发现编译都通不过,不知道是什么原因。
下面是Vector类的片段。

// 定义 Vector 模板类
typedef int Rank; // 秩,即下标
#define DEFAULT_CAPACITY 3 // 默认的初始容量
 template <typename T> class Vector
{
protected:
    // 规模、容量、数据区
    Rank _size;
    int _capacity;
    T* _elem;
    //省略其他部分
public:
    // 构造函数
    Vector(int c = DEFAULT_CAPACITY, int s = 0, T v = 0) // 容量为c,规模为s,所有元素初始化为v
    {
        _elem = new T[_capacity = c];
        for (_size = 0; _size < s; _elem[_size++] = v);
    }
    T& operator[](Rank r) const; 
    // WWQ 自定义
    T& get(Rank r)
    {
        return _elem[r];
    }
    void show()
    {
        for (int i = 0; i < _size; i++)
            cout << _elem[i] << endl;
        cout << endl;
    }

下面是对下标运算符的重载

 // 重载下标运算符
template <typename T> T& Vector<T>::operator[](Rank r) const
{
    return _elem[r];
}

在main()里创建一个Vector对象vs并初始化。vs.operator 和 vs[1]都无法访问,但是vs.get(1)可以,因此我怀疑是下标运算的重载有问题,可是又找不到哪里有问题,还请各位大神指教。

更新1:
发现并不是代码的问题,重载是没问题的。之前将重载实现在单独的.cpp文件,然后编译不了;后来直接在.h文件实现了重载,发现就没有问题了。
终极更新【解决】:
原来类模板的定义是不能分离成.h文件和.cpp文件的,与类不同,类模板的声明与实现必须放在同一个文件!!!分开放了之后根本就找不到重载运算符的实现,自然就出错了,基础不牢,血的教训啊
详细内容参考:http://blog.csdn.net/pongba/article/details/19130。写的非常清楚。

1个回答

 template <typename T> T& Vector<T>::operator[](Rank r) const
->
template <typename T> T& Vector<T>::operator[](int r) const
knightaoko
knightaoko Rank是定义过的,忘记附上去了:typedef int Rank; // 秩,即下标
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐