2014-11-20 8 views
5

Si verificano problemi di overloading dell'operatore subscript con una classe template in C++. Ho una implementazione personalizzata della classe di mappe e devo essere in grado di accedere agli elementi tramite la chiave.Problemi di overloading [] operatore con una classe template

template <typename K, typename DT> 
DT& myMap<K, DT>::operator[](K key) 
{ 
    for (int i = 0; i<size; i++) 
{ 
    if (elements[i].key == key){ 
     return elements[i].data; 
    } 
} 
} 

È come sto cercando di sovraccaricare l'operatore al momento. Il compilatore non accetta il tasto K per cercare i dati. K è il tipo di dati per la chiave. Questo è archiviato in una classe separata che la classe myMap contiene in una matrice.

Quindi, se nel principale cerco di fare:

myMap<string, int> * test = new myMap < string, int > ; 
test["car"] = 50; 

Dice:

Error expression must have an integral or unscoped enum type 

Io non sono molto sicuro di quello che è il problema.

+4

Perché non basta usare 'myMap prova; 'e quindi' test ["car"] 'funzionerà come previsto. –

+1

Il problema è che stai usando 'new' inutilmente, che è una cattiva abitudine che dovrebbe essere evitata in C++. Questo non è Java o C#. –

risposta

5

test è un puntatore a MyMap, non un suo oggetto, quindi test["car"] sta chiamando l'operatore di deferenziazione incorporato, non il sovraccarico.

È necessario (*test)["car"] o test->operator[]("car") per farlo funzionare.

+0

Grazie per la tua rapida risposta. Sì, questo l'ha risolto. –

+0

No, questa non è la migliore risposta. Sì, questo fa funzionare il codice, ma non risolve "il problema"! Il problema non è che il codice non viene compilato, ma che l'OP usa inutilmente un puntatore e l'allocazione dell'heap! –

+0

@FabioFracas sì, questo rende la mia risposta inutile. Grazie per il downvote. – jrok

0

L'errore è che si utilizza un puntatore a MyMap anziché all'oggetto stesso. Invece di

myMap<string, int> * test = new myMap < string, int > ; 
(*test)["car"] = 50 // works but is not idiomatic C++ 
// ... 
delete test; // don't forget! 

si dovrebbe usare

auto test = myMap<string, int>{}; 
// or: myMap<string, int> test = myMap<string, int>{}; 
test["car"] = 50 

Se avete veramente bisogno di utilizzare i puntatori, si dovrebbe almeno usare puntatori intelligenti:

auto test_ptr = std::make_unique<myMap<string, int>>(); 
// or: std::unique_ptr<myMap<string, int>> test_ptr = std::make_unique<myMap<string, int>>(); 
(*test)["car"] = 50;