Probleme mit der Ableitung von Vorlagenargumenten in nicht deduzierbaren Kontexten
In diesem Codeausschnitt stoßen wir auf einen Fehler, wenn wir versuchen, die Testfunktion zu verwenden mit einem TMap
struct TMap { typedef std::map<T, T> Type; }; template<typename T> T test(typename TMap<T>::Type &tmap_) { return 0.0; } int main() { TMap<double>::Type tmap; tmap[1.1] = 5.2; double d = test(tmap); // Error }
Der Fehler ist auf die Unfähigkeit des Compilers zurückzuführen, das T-Vorlagenargument aus dem Argument tmap der Funktion abzuleiten. Diese Situation entsteht, weil wir uns in einem nicht ableitbaren Kontext befinden, in dem das Vorlagenargument nicht aus den Argumenten des Funktionsaufrufs abgeleitet werden kann.
Bei der vorlagenbasierten Programmierung gibt es bestimmte Situationen, in denen der Compiler dies automatisch tun kann Leiten Sie die Vorlagenargumente aus den Funktionsaufrufargumenten ab. Dies wird als Vorlagenargumentabzug bezeichnet. In diesem Fall kann der Compiler jedoch T nicht basierend auf tmap_ ableiten, da es sich um eine Instanz von std::map
Wenn wir TMap für einen bestimmten T-Typ spezialisieren würden, könnte der Compiler nicht bestimmen, welche Spezialisierung er anwenden soll, da std::map
Um dieses Problem zu beheben, können wir beim Aufruf der Testfunktion explizit das T-Vorlagenargument angeben:
double d = test<double>(tmap);
Durch die Angabe von double als Vorlagenargument kann der Compiler kann den Typ von tmap_ korrekt ableiten und daraus schließen, dass er mit TMap
Das obige ist der detaillierte Inhalt vonWarum schlägt die Ableitung von Vorlagenargumenten mit „std::map' in einem nicht deduzierbaren Kontext fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!