#include
struct TrueType { char _strub; };
struct FalseType { char _strub[2]; };
template struct Instance { typedef T InstanceType; };
template TrueType InstanceChecker(typename T::InstanceType const*);
template FalseType InstanceChecker(...);
struct Base1 : public Instance {};
struct Base2 : public Instance {};
struct Fail : public Base1, public Base2 {};
int main()
{
if (sizeof(InstanceChecker(0)) != sizeof(TrueType))
std::cout << "base1" << std::endl;
if (sizeof(InstanceChecker(0)) != sizeof(TrueType))
std::cout << "base2" << std::endl;
if (sizeof(InstanceChecker(0)) != sizeof(TrueType))
std::cout << "fail" << std::endl;
return 0;
}
вывод:
fail
а все потому, что когда компилятро не может явно выбрать какой из типов Base1::InstanceType или Base2::InstanceType использовать в качестве Fail::InstanceType, он решает, что в Fail такого типа нет вообще. А раз инстанцирование этого типа (явно) нигде не происходит, то и ошибок компиляции тоже нет, пятница прошла не зря.