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
    
    评论

报告相同问题?

悬赏问题

  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?