Pourquoi VisualC++ (2008) est-il confondu 'C2666: 2 surcharges ont des conversions similaires' quand je spécifie une énumération comme deuxième paramètre, mais pas quand je définis un type booléen?Énumérations, surcharges constructeur avec conversions similaires
La correspondance de type ne devrait-elle pas exclure le second constructeur parce qu'il s'agit d'un type 'basic_string'?
#include <string>
using namespace std;
enum EMyEnum { mbOne, mbTwo };
class test {
public:
#if 1 // 0 = COMPILE_OK, 1 = COMPILE_FAIL
test(basic_string<char> myString, EMyEnum myBool2) { }
test(bool myBool, bool myBool2) { }
#else
test(basic_string<char> myString, bool myBool2) { }
test(bool myBool, bool myBool2) { }
#endif
};
void testme() {
test("test", mbOne);
}
Je peux contourner ce problème en spécifiant une référence 'ie. string_string & myString 'mais pas si c'est' const basic_string & myString '.
Appelant aussi explicitement via "test ((basic_string)" test ", mbOne);" fonctionne aussi.
Je suppose que cela a quelque chose à voir avec le fait que chaque expression/type est résolu en un bool via un '! = 0' inhérent.
curieux commentaires tout de même :)
L'une des meilleures descriptions de la résolution de surcharge peut être trouvée dans l'annexe B de [Modèles C++: Le Guide complet] (http://www.amazon.com/Templates-Complete-Guide-David-Vandevoorde/dp/0201734842). Le reste du livre est également excellent, mais cette annexe est une liste très succincte et facile à consulter des règles de résolution de surcharge. –