Вы говорите о неявной реализации . Но это происходит только в том случае, если полные типы классов будут влиять на семантику программы.
В вашем случае тип класса не обязательно должен быть полным, потому что тип, который вы вводите, может оставаться неполным (тело класса не нужно, поэтому нет необходимости создавать его экземпляр). Чтобы проиллюстрировать это, вы также можете сказать typedef class MyFunnyThing type;
в своем собственном утверждении, нигде не определяя этот класс.
Если вы создаете объект, его тип должен быть полным, и поэтому шаблон класса затем создается неявно. Обратите внимание, что неявное создание экземпляра шаблона класса не приведет к неявному созданию экземпляра функции-члена или статических определений элемента данных, если только они явно не используются в другом месте.
Кроме того, чтобы объявить специализацию шаблона класса, весь смысл в том, чтобы предотвратить создание экземпляра, чтобы сказать компилятору "не создавать экземпляр, потому что позже Я специализирую это явно ". Объявление, если ваша специализация также пропускает template<>
перед ней.