knightaoko 2016-11-07 10:49 采纳率: 0%
浏览 863

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

按照教程想实现一个自定义的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条回答 默认 最新

  • threenewbee 2016-11-07 10:55
    关注
     template <typename T> T& Vector<T>::operator[](Rank r) const
    ->
    template <typename T> T& Vector<T>::operator[](int r) const
    
    评论

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题