実際にはベクトルのベクトルであり、両方のクラスがテンプレートである 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);
}
可能であれば、何か提案を聞きたいです。