Encore plus vicieux ^^
Tel quel, le code affiche un booléen pour "test", car "test" est un char * et non un std::string. Un char * est plus facilement convertible en bool (ou int) par la promotion d'entier qu'en std::string (convertion implicite avec un constructeur qui a un seul argument).
C++ "traîne" derrière lui son héritage C. Cela peut être commode (réutilisation de code) mais est aussi incroyablement dangereux, comme ici.
Pour éviter ceci, il faut utiliser uniquement std::string.
Et donc le code suivant :
my_wrapper.print("test");
devrait être :
my_wrapper.print(std::string("test"));
ou en C++14 (il me semble) :
my_wrapper.print("test"s);
ou en C++11 avec le « user-defined literals » qui va bien :
my_wrapper.print("test"_s);
Demander ça à l'utilisateur n'est pas raisonnable et donc il faut fournir une surcharge pour char * :
void print(char const * const value) const { std::cout << "string: " << value << std::endl; }
PS : Il manque tous les std:: aux cout et endl.
Partager