我正在尝试使用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'