Si può pensare a un template come a una grossa macro gestita dal compilatore invece che dal preprocessore. Non se se potessero essere fatti meglio, ma con le mie conoscenze attuali lo escludo. E nel C++0x le cose non sono cambiate. Hanno anche rimosso l'extern, considerato inutile.
Tra l'altro il problema di linking non è del template in se. Se metti una funzione in un file header, il problema è uguale. Se metti una funzione inline in un .cpp con l'intenzione di esportarla, il problema rimane.
Il problema di fondo è che il C++ è stato costruito per essere C compatibile, ereditando così tutta la struttura di preprocessing, compiling e linking.
Probabilmente se Stroustrup non avesse dovuto tener conto di questa possibilità, il C++ sarebbe molto diverso da ciò che conosciamo oggi.

Rispondi quotando