Я пытаюсь использовать SFINAE , чтобы отличить класс, в котором есть член с именем 'name'.Я настроил все в соответствии с тем, что кажется стандартным шаблоном, но он не работает - вместо молчаливого игнорирования подстановки «сбой» компилятор выдает ошибку.
Я уверен, что столкнулся скакое-то правило замены шаблонов, я был бы признателен, если бы кто-нибудь мог объяснить, какое из них.
Это упрощенный пример.Я использую 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'