0

我正在尝试制作一个 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);
    }

如果可能的话,我很想听听任何建议。

4

4 回答 4

2

Mat是指向向量的指针。没有理由动态分配向量,只需使用vector<vector<H>> Mat;.

此外,operator[]通常有两种重载:一个要读取的 const 和一个要写入的非常量:

//Read overload
const T& operator[](std::size_t index) const 
{
    return /* blah blah */
}

//Write overload
T& operator[](std::size_t index) 
{
    return /* blah blah */
}

这允许在 const 上下文中读取向量。

于 2013-10-06T14:35:00.720 回答
0

Mat是一个vector< vector<h> >*,不是一个vector< vector<h> >。因此,Mat[index]不调用vector::operator[].

于 2013-10-06T14:31:46.873 回答
0
vector< vector<h> > *Mat;

为什么你有指针?你不需要它。它应该只是一个vectorof vector<h>

vector< vector<h> > Mat;

注意:这只是一个约定,但模板参数使用大写名称,否则其他人会讨厌你;)

于 2013-10-06T14:33:40.473 回答
0

谢谢各位,我的问题已经解决了。为了避免在初始化矩阵时出现奇怪的错误,最好使用上面示例中的非动态向量。链接器错误已通过在头文件(从 vector.cpp 到 vector.h)中复制粘贴函数的定义得到修复。它也可以通过在头文件中包含 .cpp 文件来完成。奇怪,但单个向量与分离的文件完美配合,这就是为什么我从来没有认为这是问题的根源。

于 2013-10-07T17:22:26.357 回答