c++ - operator [] const参照の2次元ポインタのオーバーロード

原文 c++ c++11

const行列の「+」演算子をオーバーロードするには、「[]」を使用します

Matrix const operator+(const Matrix & mat1, const Matrix & mat2)
{
    Matrix sum(mat1);
    if (sum.height != mat2.height || sum.width != mat2.width)
    cout << "Dimension error!";
    else {
    for (int i = 0; i < sum.height; i++)
        for (int j = 0; j < sum.width; j++)
            sum[i][j] = mat2[i][j];
    }
    return sum;
}


したがって、[]のオーバーロードを定義します

(const int*)& operator[] (int i) const {
    return (*this).ele[i + 1];
}


しかしIDEはエラーを報告します

"Error  IntelliSense: a reference of type "const int *&" (not const-qualified) cannot be initialized with a value of type "int *"


このエラーを解決するには?私は何度もTATを試しました。

そしてこれがコード全体です:

#define NULL 0
#include<iostream>
using namespace std;

class Matrix {

private:
    int width, height;
    int **ele;

public:
    Matrix();
    Matrix(int**);
    Matrix(int, int);
    Matrix(const Matrix&);
    Matrix operator= (const Matrix&);
    friend const Matrix operator+ (const Matrix&, const Matrix&);
    friend const Matrix operator- (const Matrix&, const Matrix&);
    (int*)& operator[] (int i) {
        return (*this).ele[i + 1];
    }
    (const int*)& operator[] (int i) const {
        return (*this).ele[i + 1];
    }
 };

Matrix::Matrix() {
    width = 0; height = 0;
    ele = NULL;
}

Matrix::Matrix(const Matrix& mat) {
    Matrix(mat.height, mat.width);
    for (int i = 0; i < height; i++)
        for (int j = 0; j < width; j++) {
            (*this)[i][j] = mat[i][j];
        }
}
Matrix::Matrix(int** e) {
    (*this).height = e[0][0];
    (*this).width = e[0][1];
     for (int i = 1; i < height; i++)
        for (int j = 0; j < width; j++) {
            (*this).ele[i][j] = e[i][j];
        }
}

Matrix::Matrix(int height, int width) {
    (*this).width = width;
    (*this).height = height;
    ele = new int*[height + 1];
    ele[0] = new int[2];
    ele[0][0] = height; ele[0][1] = width;
    for (int i = 1; i < height + 1; i++)
    {
        ele[i] = new int[width];
    }
    for (int i = 1; i < height; i++)
        for (int j = 0; j < width; j++) {
            ele[i][j] = 0;
        }
}

inline Matrix Matrix::operator=(const Matrix & mat)
{
    Matrix tempMat(mat);
    return tempMat;
}

Matrix const operator+(const Matrix & mat1, const Matrix & mat2)
{
    Matrix sum(mat1);
    if (sum.height != mat2.height || sum.width != mat2.width)
        cout << "Dimension error!";
    else {
        for (int i = 0; i < sum.height; i++)
            for (int j = 0; j < sum.width; j++)
                sum[i][j] = mat2[i][j];
    }
    return sum;
}

Matrix const operator-(const Matrix & mat1, const Matrix & mat2)
{
     Matrix diff(mat1);
    if (diff.height != mat2.height || diff.width != mat2.width)
        cout << "Demension error!";
    else {
        for (int i = 0; i < diff.height; i++)
            for (int j = 0; j < diff.width; j++)
                diff[i][j] = mat2[i][j];
    }
    return diff;
}
答え
ユーザーremyabelが言ったように、オーバーロードされた演算子のシグネチャから括弧を削除すると、コードがコンパイルされた(g++バージョン4.6.3)ことがわかりました。
だから試して

int* operator[] (int i) {
    return (*this).ele[i + 1];
}
const int* operator[] (int i) const {
    return (*this).ele[i + 1];
}


の代わりに

(int*)& operator[] (int i) {
    return (*this).ele[i + 1];
}
(const int*)& operator[] (int i) const {
    return (*this).ele[i + 1];
}
関連記事

c++ - C++でFLを16進数に変換する

c++ - スレッドC++を使用してシェルコマンドを実行する

c++ - ポインターと多次元配列の質問

c++ - Qt:フォーム全体にフォントの変更を適用する

java - 最小の「XOR」演算でバイナリマトリックスを再作成する

c++ - doxygenの「ファイルドキュメント」リストから「README.md」を除外します

java - Android Gstreamer SDKでANativeWindow_lockがエラー-22を返す

c++ - C++プロキシDLL(64ビット)

c++ - 誤った値を返す二重ハッシュ関数

c++ - OpenCVでのレーン検出器分割線C++