0

私はC ++が苦手で、配列内の配列でエラーが発生するのはなぜか疑問に思っていましたが、通常の配列では問題なく動作します(およびそれを修正する方法)。

コードは次のとおりです(配列を構築するときにクラス内に配列を格納しようとしています):

class foo {
    int* stored;
public:
    foo(int* ptr) {
        stored = ptr;
    }
};

int main() {
    int arr[][2] = {{1,4},{5,7},{2,5}};
    foo obj(arr);
}

配列がint arr[] = {1,2,3}エラーなしで動作するようなものである場合、通常のコードでは次のエラーが表示されます。

error: no matching function for call to 'foo::foo(int [3][2])'

しばらく検索しましたが、そもそも何を検索すればよいのかよくわかりません。そのため、ここで質問しています(ただし、ポインターと関係があると思います)。助けてくれてありがとう。

4

2 に答える 2

1

まず、コードは (たとえ機能していたとしても) 配列を格納しません。クラスにはポインターがあるため、格納しているのは配列へのポインターだけです。これらの区別を頭の中で明確にすることが重要です。

「保存」しようとしている配列と互換性のあるポインターを宣言する必要があります。そのポインターは ですint (*stored)[2]。これは、2 つの int の配列へのポインターです。

実際にはかなり単純です

int* is compatible with int[]
int (*)[N] is compatible with int[][N]
int (*)[N][M] is compatible with int[][N][M]

etc. etc. しかし、括弧は人々を混乱させます。*オペレーターはオペレーターよりも優先度が低いため、それらが必要[]です。

于 2013-09-22T00:11:25.513 に答える