与c ++模板混淆

时间:2016-02-24 23:48:17

标签: c++ templates

我正在完成一项家庭作业,包括将我教授提供的矩阵和数组类转换为模板。我收到错误'=':我的行m[i] = new Array < Type >(cols);无法将'Array *'转换为'int' 我认为这是因为m [i]返回一个int,但我认为不应该是我正确编写模板而且我无法弄清楚为什么它会返回一个int而不是一个数组指针m是一个数组指针数组,这里是我的数组模板的代码减去&lt;&lt;&lt;&lt;未在此代码中使用。

template
< typename Type >
class Array
{
private:
    int len;
    Type * buf;
public:
    Array(int newLen)
        : len(newLen), buf(new Type[newLen])
    {
    }
    Array(const Array & l)
        : len(l.len), buf(new Type[l.len])
    {
        for (int i = 0; i < l.len; i++)
            buf[i] = l.buf[i]; 
    }
    int length()
    {
        return len;
    }
    int & operator [] (int i)
    {
        assert(0 <= i && i < len);
        return buf[i];
    }
}

这是我的矩阵模板,错误发生在减去相同的&lt;&lt;重载

#pragma once
#include "Array.h"

template
< typename Type >
class Matrix
{
private:
    int rows, cols;
    Array< Array<Type> * > m;
public:
    Matrix(int newRows, int newCols)
        : rows(newRows), cols(newCols), m(rows)
    {
        for (int i = 0; i < rows; i++)
            m[i] = new Array < Type >(cols);
    }
    int numRows()
    {
        return rows;
    }
    int numCols()
    {
        return cols;
    }
    Array < Type > & operator [] (int row)
    {
        return *m[row];
    }
}

2 个答案:

答案 0 :(得分:2)

数组类中的[]运算符重载会让你感到烦恼。

 int & operator [] (int i)
{
    assert(0 <= i && i < len);
    return buf[i];
}

它显然返回一个int作为其类型,当您尝试使用它时:m[i] = new Array < Type >(cols);

m [i]将返回一个你正在尝试为其分配新数组的int类型。

答案 1 :(得分:1)

近端问题是Array没有完全模板化:

int & operator [] (int i)

索引到Array<T>不应该为您提供int&,它应该为您提供T&

您的代码的另一个问题是您的new构造函数中有Array - 其中对应的delete?你在泄露记忆!

Matrix构造函数相同,如果你碰巧复制它,它还有可能双重删除内存。

请参阅Rule of Three