Тип не наследуется в SFINAE для множественного наследования? - PullRequest
3 голосов
/ 10 октября 2011

Я использую механизм SFINAE для определения типа. Resolve<T>::type выводится в T, если class T не содержит yes, и выводится в MyClass, если оно содержит yes.

class MyClass {};

template<typename>
struct void_ { typedef void check; };

template<typename T, typename = void>
struct Resolve { typedef T type; };

template<typename T>
struct Resolve <T, typename void_<typename T::yes>::check> {
    typedef MyClass type;
};

Теперь у меня есть простые тестовые классы, как,

struct B1 { typedef int yes; }; // 1
struct B2 { typedef int yes; }; // 2
struct D1 {};  // 3
struct D2 : B1 {};  // 4
struct D3 : B1, B2 {}; // 5 <----

В соответствии с приведенной ниже логикой, результатом вышеприведенных испытаний должен быть:

  1. Resove<B1>::type = MyClass
  2. Resove<B2>::type = MyClass
  3. Resove<D1>::type = D1
  4. Resove<D2>::type = MyClass
  5. Resove<D3>::type = MyClass или ошибка компилятора (из-за неоднозначности между B1, B2)

Странно, но в тестовом примере (5) этого не произошло. Результат

Resolve<D3>::type = D3;

Может кто-нибудь объяснить, что магия происходит специально для множественного наследования? Не получается ошибка компилятора - это стандартное поведение? Вот демоверсия .

1 Ответ

3 голосов
/ 10 октября 2011

Почему вы ожидаете ошибку компилятора? Вы знаете, SFINAE означает Substitution Failure Is Not An Error верно?

Когда вы заменяете T на D3, выражение становится неоднозначным. Из-за SFINAE этот сбой не считается ошибкой, и ваша специализация просто удаляется в качестве кандидата. Это все о НЕ получении ошибки компилятора.

...