Причина, по которой многие из этих вызовов терпят неудачу, заключается в том, что существует синтаксическая неоднозначность, которую необходимо устранить, используя одно из самых неясных случаев использования ключевого слова template
.Вместо записи
this->fbase<true>(5);
Вам необходимо написать
this->template fbase<true>(5);
Причина в том, что без ключевого слова template
компилятор анализирует это как
(((this->fbase) < true) > 5)
Что бессмысленно.Ключевое слово шаблона явно устраняет эту неоднозначность.Добавление ключевого слова template
в другие упомянутые вами случаи должно исправить эти проблемы.
На самом деле я не уверен, почему это работает для прямых базовых классов, поэтому если бы кто-то мог ответить на эту часть вопроса, я былюблю видеть, что ответ.