'name' adında bir üyeye sahip bir sınıfı ayırt etmek için SFINAE kullanmaya çalışıyorum. Standart model gibi görünen şeyleri ayarlıyorum ama çalışmıyor - 'başarısız' ikamesini sessizce göz ardı etmek yerine, derleyici bir hata üretir.SFINAE: Bazı hatalar diğerlerinden daha eşit midir?
Bazı şablon değiştirme kurallarına karşı koştuğumdan eminim, biri hangisini açıklayabilirse minnettar olurum.
Bu, soyulmuş bir örnektir. Gcc kullanıyorum:
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'
Hangi derleyiciyi kullanıyorsunuz? g ++ 4.4.3 bu kodu kabul eder ve '-Wall -Wextra -pedantic' ile bile herhangi bir diyagnostik yaymaz. –
@Tyler: "struct" tanımlarından sonra eksik yarı-colonslar için tanılama yapmıyor mu? ;-) –
oops :-); Eminim ki (dikkatsiz yazarak mazeret) –