D
die jeweilige spezialisierung, natürlich. aber ein bisschen aufpassen musst du in deinen formulierungen. der compiler schreibt die objektdateien, und natürlich erzeugt er code für jede (implizite oder explizite) instanziierung eines funktionstemplates, einmal; (edit: schau dir im standard kapitel 3.2 zur one-definition-rule an) genauso, wie er für jede inline-funktion mit externer linkage nur etwas erzeugt, das sich so verhält, als gäbe es es nur einmal. dir kann, wenn du bei standard c++ bleibst, zuerst mal völlig egal sein, wer was wie erzeugt und was in den arbeitsspeicher wann und wo und wie geladen wird. C++ (03) macht hier sowieso wenige garantien, was reihenfolgen oder so etwas anbelangt. der standard garantiert dir nur, dass von jeder funktion mit externer linkage du jederzeit einen funktionszeiger auf diese funktion bekommen kannst, der über alle übersetzungseinheiten hinweg denselben "wert" haben muss, den du in einen beliebigen anderen funktionszeiger (aber nicht elementfunktionszeiger oder "normalen" zeiger) oder nach bool konvertieren kannst (oder in einen integralen typen, der groß genug ist) und wieder zurück, so dass nach der rückkonvertierung der zeiger wieder auf dasselbe "ding" zeigt.
aber der standard garantiert dir z.b. nicht einmal folgendes:
//foo.cpp
int foo () { return 0; }
//main.cpp
int foo ();
typedef void (*fun_ptr) ();
int main ()
{
fun_ptr ptr = reinterpret_cast<fun_ptr>(foo());
assert (ptr == 0);
}