2016-07-10 12 views
-1

Ich bin eine Array-Klasse 2D zu schreiben und versuchen, den Betreiber zu überlasten []:Warum ist 'keine brauchbare Überlastung des Operators'?

typedef unsigned long long int dim; 

template<typename N> 
class Array2D { 

private: 

    dim _n_rows; 
    dim _n_cols; 
    vector<vector<N>> M; 

public: 

    dim n_rows() { return _n_rows; } 
    dim n_cols() { return _n_cols; } 
    Array2D(): _n_rows(0), _n_cols(0), M(0, vector<N>(0)){} 
    Array2D (const dim &r, const dim &c) : _n_rows(r), _n_cols(c), M(r, vector<N>(c)) {} 

    void set(const dim &i, const dim &j, const N &elem) { M[i][j] = elem; } // Works fine 
    vector<N>& operator[](int &index) { return M[index]; } // <- PROBLEM 
}; 

So wie ich es sehe: Operator [] kehrt etwas (Vektor), die wiederum den überladenen Operator hat []. Deshalb denke ich, dass

Array2D<int> L(10, 10); 
L[3][3] = 10; 

sollte funktionieren.

Offenbar denkt der Compiler nicht, sagen, dass 'Kein praktikabler überladener Operator [] für den Typ' Array2D ' Was mache ich falsch und wie es zu beheben?

PS. XCode 7, wenn das wichtig ist.

+6

Warum als Referenz nehmen Sie die int? – tkausl

+2

das funktioniert: http://coliru.stacked-crooked.com/a/841cd49502f05fe9 –

+0

@ m.s. Hmm, also ist es ein Compiler-Problem? – alekscooper

Antwort

4

Diese Funktion:

vector<N>& operator[](int &index) 

Kann nicht so genannt werden:

Array2D<int> L(10, 10); 
L[3][3] = 10; 

Da eine nicht konstante Referenz auf eine wörtliche kann daher nicht übernommen werden. Referenzen erlauben Modifikation, und was würde es bedeuten, 3 zu ändern?

sollten Sie diese stattdessen verwenden:

vector<N>& operator[](size_t index) 
Verwandte Themen