Если вы измените свою первую функцию на:
template <class ptr_t>
void add(std::shared_ptr<ptr_t>& b) {
buttons.insert(b);
}
Тогда ваш код скомпилируется и будет работать как положено.
Обратите внимание на две вещи:
- Обе функции
template
.
- Оба принимают ссылку на не
const
объект.
Допустимая функция шаблона предпочтительнее, чем не шаблонная функция, которая нуждается в некотором «преобразовании».
Кстати, в вашем примере нет СФИНАЕ. Фактически, template<class container_t> void add(container_t& c)
является приемлемым совпадением.