Bonjour à tous !
J'ai une question dans la lignée du sujet Restriction sur une classe template (dont j'étudie attentivement les réponses )

Dans les briques de bases de mon appli, il y a les fichiers suivant :

Error .h qui définit tous les codes d'erreurs utilisés dans le projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
enum Error
{
// code d'erreur...
};
ErrorIO.h qui permet de convertir un code d'erreur entier en chaine lisible par un humain. Ce fichier est en C et il est d'ailleurs inclus dans un sous-projet en C.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
#include "Error.h"
char* to_string(Error err);
et string_utility.h qui fournit une fonction de conversion générique vers string.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
#include "Error.h"
template<typename T>
std::string to_string(const T&)
{
    std::ostringstream oss;
    oss << Value;
    return oss.str();
}
Il n'y a aucune relation entre ErrorIO.h et string_utility.h à part l'include commun de Error.h. Notez aussi que les deux fonctions to_string ont des types de retour différents...

Je cherche à interdire dans mon code de plus haut niveau l'appel de la fonction to_string générique de string_utility.h quand le paramètre est un code d'erreur et forcer le client à utiliser la to_string() de ErrorIO.h

Dans l'idéal il suffirait de bien vérifier que string_utility.h n'est pas inclus et que ErrorIO.h le soit, mais vu que string_utility.h se retrouve inclus un peu partout dans le projet c'est presque impossible d'être sur.

En C++0x, il me semble qu'on pourrait résoudre le problème en supprimant explicitement la spécialisation pour une Error avec =delete
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
// Please don't use the generic to_string() function for error codes. 
// Include instead "ErrorIO.h" wich provide the correct to_string function for them.
template <>
std::string to_string<Error>(const Error&) = delete;
Si la personne qui cherche à faire un to_string() avec un Error n'a inclus que string_utility.h alors la compilation planterait sur la ligne du =delete, elle verrait le commentaire, inclurait ErrorIO.h et voila !

Mais comment fait-on en pur C++03 ? (et sans accès à boost)
Merci !