Heim > Backend-Entwicklung > C++ > Warum schlägt die Ableitung von Vorlagenargumenten mit „std::map' in einem nicht deduzierbaren Kontext fehl?

Warum schlägt die Ableitung von Vorlagenargumenten mit „std::map' in einem nicht deduzierbaren Kontext fehl?

Linda Hamilton
Freigeben: 2024-12-17 07:33:25
Original
910 Leute haben es durchsucht

Why Does Template Argument Deduction Fail with `std::map` in a Non-Deducible Context?

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 Beispiel:

struct TMap
{
    typedef std::map<T, T> Type;
};

template<typename T>
T test(typename TMap<T>::Type &amp;tmap_) { return 0.0; }

int main()
{
    TMap<double>::Type tmap;
    tmap[1.1] = 5.2;
    double d = test(tmap); // Error
}
Nach dem Login kopieren

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 handelt, die nicht direkt an TMap::Type gebunden ist.

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 kann sowohl mit TMap und TMap.

Um dieses Problem zu beheben, können wir beim Aufruf der Testfunktion explizit das T-Vorlagenargument angeben:

double d = test<double>(tmap);
Nach dem Login kopieren

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::Type.

übereinstimmt

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage