按照教程想实现一个自定义的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。写的非常清楚。