Existem vários motivos para isso, os princípais estão listados abaixo:
Isso impede o uso de recursão de template como estrutura de loop, pois não é possível estabelecer uma condição de saída da recursão.
Isso restringe a configurabilidade de uma classe genérica ('template'). Não é possível especificar por parâmetro algo como "utilizar_busca_ordenada", ou "número_máximo_de_elementos_na_lista".
A vantagem dessa característica é que a simples leitura de uma classe genérica permite a availação de quais chamadas de métodos, acesso a atributos, etc.. são válidas para cada objeto/classe. Em C++, por exemplo, parâmetros de templates não são tipados. Com isso, um classe template não pode ser validada através do seu código, pois dependendo do parâmetro forncecido a instanciação do template pode ou não ser válida. A abordagem de C++, apesar de dificultar o entendimento do código e complicar a validação de código implementado, permite uma flexibilidade muito maior. A vantagem é que um template depende apenas da interface do tipo passado como parâmetro. Além disso ele mantém ela flexível, exigindo apenas os métodos/atributos/typedefs que foram efetivamente utilizados.
Em C++ o seguinte template é valido: templatestruct Y : public X { //code };
SMP implica em gerar código otimizado para cada uma das instanciações dado os parâmetros de entrada (além dos externos, porém estes são constantes entre instanciações e suportados pelo Eiffel). Isso provavelmente não é verdade para classes que possuem a propriedade EXPANDED, que diz que não deve ser usado um ponteiro para um objeto dessa classe, mas sempre copiá-la (tal qual um int na declaração: int x; classes não espandidas equivaleriam a int *x;). Isso deve, no entando, ser confirmado. A explicação para o uso do mesmo código é a tentativa de Eiffel de reduzir ao máximo as penalidades do suporte a genericidade, principalmente em tamanho de código, gerada por outras alternativas onde cada instancia irá gerar código extra, o que na maioria dos casos não é desejável.