我正在尝试制作一个 2D 矩阵类,它实际上是向量的向量,并且两个类都是模板。我在向量类中重载了下标运算符。当我尝试使用错误消息在矩阵类中重载 operator[] 时会出现问题: error C2440: 'return' : cannot convert from 'vector' to 'vector &'。这是我的课程中的代码:
template <typename t>
class vector
{
private:
t *Mem;
int vectsize;
public:
vector<t> (int _vectsize = 0);
//some other methods here
t& operator[](int index)
{
return Mem[index];
}
};
和
template <typename h>
class matrix
{
private:
int dim;
vector< vector<h> > *Mat;
public:
matrix<h> (int _dim = 0);
matrix<h> (const matrix & _copy);
vector<h>& operator[](int index)
{
return Mat[index]; //Here's the error
}
};
我进行了一些谷歌搜索,发现相同的示例或重载 () 而不是 []。我只是不明白为什么编译器看不到返回值Mat[index]作为参考(我认为它必须是参考)。当使用单个向量时,下标运算符工作得很好。请指出我的错误。提前致谢!
补充:使用非动态向量似乎可以解决当前的问题,但不是类型不匹配,而是我有两个链接器错误(未解析的外部符号)。通过注释和取消注释我的代码,我发现只有当行vector< vector<h> > Mat;
或Extend
函数存在时才会出现问题(它是类向量中的空方法)。我想这与向量构造函数有关,但我不知道到底出了什么问题。
template <typename t> //vector constructor
vector<t>::vector(int _vectsize)
{
vectsize = _vectsize;
Mem = new t[vectsize];
for (int i=0; i<vectsize; i++)
Mem[i] = 0;
}
在 matrix.h 中(它还没有在单独的文件中):
matrix<h> (int _dim = 0) : Mat(_dim)
{
dim = _dim;
for (int i=0; i<dim; i++)
Mat[i].Extend(dim-i);
}
如果可能的话,我很想听听任何建议。