Проблема в том, что bar
никогда не является функцией, это шаблон функции. Если я немного изменю строку проблемной c, static_assert сработает:
template <typename T>
bool bar(T obj) noexcept {
static_assert(&Derived::bar != &TBase<Derived>::template bar<T>,
"bar missing in derived class.");
return false; // dead-line
}
Однако это утверждение всегда будет неудачным, поскольку оно явно сравнивает «обычную» функцию с шаблоном функции.
Я заставил его работать, явно устраняя неоднозначность указателей на функции, используя static_cast
:
template <typename T>
bool bar (T obj) noexcept {
static_assert(
static_cast<bool (Derived::*)(T)>(&Derived::bar)
!= static_cast<bool (TBase<Derived>::*)(T)>(&TBase<Derived>::bar)
, "bar missing in derived class.");
return false; // dead-line
}
Однако вам также явно необходимо извлечь шаблонную функцию bar
из TBase
в TDerived
:
class TDerived : public TBase<TDerived> {
public:
using TBase<TDerived>::bar;
};