non dovrebbe ritornare l'alias per essere usato al pari di un array?
una cosa tipo
public:
Data& operator [](const Key& k) {
Data value=funzione_che_ritorna_il_valore_corretto(K);
return *value;
}