Bonjour à tous !

j'essaye de spécialer la classe std::string, je m'explique :

je souhaite que dans les signatures de mes méthodes je puisse déterminer quel est le type de chaine attendu, par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
UTF8String macRomanToUtf8(MacRomanString& str);
De plus, je souhaite que la contrainte soit forte, c'est-à-dire que le compilateur refuse les conversions implicites et l'utilisation de la classe parente.

J'ai donc travaillé sur le prototype suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
class UTF8String : public std::string {
    public:
        explicit UTF8String();
        explicit UTF8String(const UTF8String& orig);
        explicit UTF8String(const std::string& other);
        explicit UTF8String(const char* other);
        UTF8String& operator =(const UTF8String& orig);
    };
J'ai eu au début des tas d'erreurs de compilations difficiles à interpréter, du style "no matching function for call to UTF8String::UTF8String(UTF8String), ce qui est assez logique puisque je n'ai pas d'opérateur ni de constructeur qui permette ca.
Cette erreur de compilation se produit dans des cas comme celui-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
UTF8String fn(std::string& str) {
UTF8String _str = traitement(str);
return _str;
}
Quel est l'opérateur caché derrière "return _str;" ? Je pensais que c'était operator= mais visiblement pas...

Bon quoi qu'il en soit j'ai du renoncer car le fonctionnement était très instable, j'avais souvent des Segfault à cause de string non initialisée ou des choses comme ca (je pensais que ca ne pouvait pas exister ca... des strings non initialisées). Qu'en pensez-vous ?

Donc voilà, j'aimerais bien réussir mon pari, mais ca semble particulièrement complexe. Peut-être devrais-je partir vers une encapsulation plutôt qu'une spécialisation ?

merci à vous