Sto tentando di utilizzare SFINAE per distinguere una classe che ha un membro chiamato 'nome'. Metto le cose in quello che sembra essere il modello standard ma non funziona - invece di ignorare silenziosamente la sostituzione 'fallita', il compilatore produce un errore.SFINAE: alcuni fallimenti più uguali degli altri?
Sono sicuro di essermi imbattuto in qualche regola di sostituzione del modello, sarei grato se qualcuno potesse spiegare quale.
Questo è un esempio ridotto. Sto utilizzando gcc:
template <typename U> string test(char(*)[sizeof(U::name)] = 0) { return "has name!"; }
template <typename U> string test(...) { return "no name"; }
struct HasName { string name; }
struct NoName {}
cout << "HasName: " << test<HasName>(0) << endl; //fine
cout << "NoName: " << test<NoName>(0) << endl; //compiler errors:
//error: size of array has non-integral type `<type error>'
//error: `name' is not a member of `NoName'
Quale compilatore stai utilizzando? g ++ 4.4.3 accetta questo codice e non emette alcuna diagnostica anche con '-Wall -Wextra -pedantic'. –
@Tyler: non emette nemmeno la diagnostica per i punti e virgola mancanti dopo le definizioni di 'struct'? ;-) –
oops :-); Sono sicuro che lo faccia (scusate la digitazione incurante) –