「名前」というメンバーを持つクラスを区別するためにSFINAEを使用しようとしています。標準パターンと思われるものを設定しましたが、機能していません。「失敗した」置換を黙って無視する代わりに、コンパイラはエラーを生成します。
私はいくつかのテンプレート置換ルールに遭遇したと確信しています。誰かがどれを説明できるかを教えていただければ幸いです。
これは簡略化された例です。私は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'