Nehmen wir an, wir eine Funktion Vorlage haben, die in der CPP-Datei mit Hilfe von expliziten Instanziierung wie dies umgesetzt wird:Aufruf explizit instanziiert Template-Funktion durch Umwandlung Operator
function.h
template<typename T> void function(T val);
function.cpp
#include "function.h"
template<typename T> void function(T val) { /* do something */ }
template void function<double>(double val);
Wir sind nun in der Lage die Funktion in einer Hauptdatei aufzurufen, die function.h wie folgt enthält:
double val = 1.0;
function(val);
Nehmen wir weiter an haben wir eine Klasse, die wie folgt durchgeführt wird:
data.h
class Data
{
private:
double mVal;
public:
Data(double val) { mVal = val; }
operator double() { return mVal; }
};
der folgende Code führt zum Linkerfehler LNK2019: nicht aufgelöstes externes (Visual Studio 2010):
Data a(1.0);
function(a);
Wir sind einer der folgenden Ausdrücke verwenden könnte eine-Funktion()
function<double>(a);
function(double(a));
...
aber warum ist es nicht möglich, einfach anrufen Funktion (a) zu liefern? Gibt es eine andere Lösung, um dies zu erreichen, ohne die Funktion function() mit dem Typ Data explizit zu instanziieren?
So Sie die Bedeutung Ihres Programms wollen davon abhängen, wie viel von Ihrem Programm haben Sie schon geschrieben? Wenn eine andere TU später die Funktion "" instanziiert, soll das die Überladungsauflösung in den bereits kompilierten TUs magisch beeinflussen? –
Das ist in der Tat ein guter Punkt. Ich habe nicht an die Möglichkeit gedacht, function() aus function.cpp zu instanziieren. – Nex