j'ai fait deux classes de test:type SFINAE dans VS2015 compile, mais génère l'erreur
class Class1
{
public:
Class1(int a) {}
};
class Class2
{
public:
Class2() {}
};
Et deux fonctions de modèle en utilisant le type SFINAE de décider lequel utiliser. Le second "échouera" si T n'est pas constructible par défaut.
template<typename T>
T* CreateInstanceTest(char*[!std::is_default_constructible<T>::value] = 0) { return nullptr; }
template<typename T>
T* CreateInstanceTest(char*[std::is_default_constructible<T>::value] = 0) { return new T(); }
Puis-je faire cela:
Class1* obj1 = CreateInstanceTest<Class1>();
Class2* obj2 = CreateInstanceTest<Class2>();
qui génère l'erreur « plus d'une instance de fonction surchargée « CreateInstanceTest » correspond à la liste des arguments ».
Cependant, il compile bien et fonctionne comme prévu. obj1 devient null et obj2 est créé correctement.
Pourquoi cela se produit-il? Et y a-t-il un moyen de contourner le problème?
Génère une erreur, mais compile bien? – Zereges
Oui. Le texte devient rouge et je vois une erreur dans la "liste d'erreurs", mais il se construit bien et je peux exécuter le programme. Cela fonctionne aussi comme prévu. – MyNiceDisplayName
utilise 'std :: enable_if_t'. – Jarod42