Mehrere Definitionen einer Funktionsvorlage

Angenommen, eine Header-Datei definiert eine Funktionsvorlage. Nehmen wir nun zwei Implementierungsdateien an#include Dieser Header und jeder von ihnen hat einen Aufruf an die Funktionsvorlage. In beiden Implementierungsdateien wird die Funktionsvorlage mit demselben Typ instanziiert.

// header.hh
template <typename T>
void f(const T& o)
{
    // ...
}

// impl1.cc
#include "header.hh"

void fimpl1()
{
    f(42);
}

// impl2.cc
#include "header.hh"

void fimpl2()
{
    f(24);
}

Man kann erwarten, dass sich der Linker über mehrere Definitionen von beklagen würdef(). Insbesondere wennf() wäre dann keine vorlage das wäre ja der fall.

Warum beschwert sich der Linker nicht über mehrere Definitionen vonf()?Ist in der Norm festgelegt, dass der Linker diese Situation ordnungsgemäß handhaben muss? Mit anderen Worten, kann ich beim Kompilieren und Verknüpfen immer auf Programme zählen, die den oben genannten ähnlich sind?Wenn der Linker clever genug ist, um eine Reihe von Instanziierungen von Funktionsschablonen zu disambiguieren, warum kann er dann nicht dasselbe für reguläre Funktionen tun, da diese identisch sind, wie dies für instanziierte Funktionsschablonen der Fall ist?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage