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]を参照として認識できない理由を理解できません(これは参照である必要があると思います)。ただし、単一のベクトルを操作する場合、添え字演算子は問題なく機能します。私の間違いを指摘してください。前もって感謝します!

追加: 非動的ベクトルを使用すると現在の問題は解決するようですが、型の不一致の代わりに、2 つのリンカー エラー (未解決の外部シンボル) が発生しました。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[]一般に 2 つのオーバーロードがあります。1 つは読み取り用の const で、もう 1 つは書き込み用の非 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;

なぜポインタを持っているのですか?あなたはそれを必要としません。単に のvectorである必要がありvector<h>ます。

vector< vector<h> > Mat;

注: これは単なる慣例ですが、テンプレートの引数には大文字の名前を使用してください。そうしないと、他の人に嫌われます;)

于 2013-10-06T14:33:40.473 に答える