T
в Traits<T>::BoolMethodPtr
находится в невыбранном контексте, поэтому компилятор не будет автоматически определять из вызова тип T.Это потому, что может быть такой код:
template<typename T>
struct Traits {
typedef bool (T::*BoolMethodPtr)();
};
template<>
struct Traits<int> {
typedef bool (Base::*BoolMethodPtr)();
};
Run(&Base::foo); /* What should T be deduced to? Base and int are both equally possible */
Если вы можете обойтись без класса Traits<T>
, вы можете написать Run
как:
template<class Class>
void Run(bool (Class::*check)()) {
Class* y = dynamic_cast<Class*>(x);
std::cout << (y->*check)();
}
В этом контекстеClass
можно вывести как среднее Base