Bonjour,

J'ai un problème avec la surcharge de l'opérateur d'indexation.
J'ai appris en cours les deux exemples de prototypes à utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
int& operator[](int); // écriture
int operator[](int) const; // lecture
Pour les besoins d'un projet où la STL est partiellement interdite (seul les headers iostream, fstream, et string sont autorisés), je cherche à reproduire un conteneur associatif avec des couples key/item (limité aux types string/int).
J'ai créé une classe Dict (par analogie avec le type dict en Python), dont voici le header :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ...
#include <string>
 
typedef std::string KeyType;
typedef int ItemType;
 
class Dict
{
public:
    // ...
 
    // ajout d'un nouveau couple key/item,
    // ou nouvelle valeur de l'item si new_key existe déjà
    ItemType& operator[](KeyType new_key);
 
    // recherche d'un item à partir d'une clef
    // une exception est levée si la clef n'existe pas
    ItemType operator[](const KeyType& key) const;
 
    // ...
Un arbre binaire est utilisé pour stocker les couples key/item.
Le but recherché est de pouvoir écrire dans le code client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Dict d;
// accès en écriture
d["test"] = 7;
d["essai"] = 52;
d["test"] = 0; // 7 est écrasé
// accès en lecture
int i = d["essai"]; // i = 52;
Le problème est que la dernière ligne de code appelle aussi la méthode d'ajout, et non celle de recherche (comportement confirmé par des cout dans les méthodes).
Du coup, si la clef existe, une référence vers l'item associé est retournée (au lieu d'être dupliqué).
Et si la clef n'existe pas, la méthode retourne une valeur indéfinie (au lieu de lever une exception).
Que dois-je modifier pour différencier l'appel de la méthode de recherche de la méthode d'ajout ?

Merci.