Тип шаблона класса не может быть определен по аргументам, передаваемым его конструктору. Чтобы узнать, какие конструкторы доступны, компилятор должен уже выбрать, какой Wrap
создать.
В блоке #else
вы явно выбрали создание экземпляра Wrap<int>
, поэтому компилятор знает, как использовать неявный конструктор Wrap<int>(int*)
.
Возможно, неофициально: тип не выводим, если его вывод предполагает знание того, что тип должен быть выведен.