Что значит "кидает странные ошибки" и "невозможно дополнить" так и не понял.
1. Мы где-то в коде пишем x.foo
, но не пишем в сингатуре что-то вроде hasFoo!T
. Когда мы пытаемся скормить функции тип без foo
у нас получится на выходе куча ошибок из кода функции (которую не факт что лично мы писали).
2. Мы можем писать шаблоны с одинаковым именем, если они инстанциируются в разных условиях. Если у нас один шаблон инстанциируются во всех случаях без ограничений и кидает ошибку компиляции в "неправильных", мы не сможем дописать его на другие типы. Ну точнее сможем, но до будут костыли и вероятно довольно неудобные.