Heim >Backend-Entwicklung >C++ >Warum schlägt die Vorlagenableitung bei impliziter Typkonvertierung für benutzerdefinierte Typen fehl?

Warum schlägt die Vorlagenableitung bei impliziter Typkonvertierung für benutzerdefinierte Typen fehl?

Linda Hamilton
Linda HamiltonOriginal
2024-10-28 14:28:301079Durchsuche

Why Does Template Deduction Fail with Implicit Type Conversion for User-Defined Types?

Implizite Typkonvertierung und Vorlagenableitung

Beim Versuch, ein int implizit in einen Skalar Objekt innerhalb eines Template-Funktionsaufrufs, schlägt die Ableitung des Template-Arguments möglicherweise fehl. Dies liegt daran, dass bei der Ableitung von Vorlagenargumenten benutzerdefinierte Konvertierungen wie die zwischen int und Scalar nicht automatisch berücksichtigt werden.

Im bereitgestellten Code:

<code class="cpp">func(a, 2);</code>

the Der Compiler versucht, den int 2 implizit in einen Skalar umzuwandeln. Objekt, aber die Ableitung des Vorlagenarguments schlägt fehl, da benutzerdefinierte Konvertierungen nicht berücksichtigt werden. Um dieses Problem zu lösen, muss das Argument explizit auf der Aufruferseite konvertiert werden:

<code class="cpp">func(a, Scalar<int>{2}); // C++14</code>

Alternativ kann bei Verwendung von C 17 ein Abzugsleitfaden für Scalar definiert werden, der die folgende Syntax ermöglicht:

<code class="cpp">func(a, Scalar{2});</code>

Schließlich kann die explizite Instanziierung der Vorlagenfunktion mit dem angegebenen Typargument auch die Notwendigkeit einer impliziten Konvertierung umgehen:

<code class="cpp">func<int>(a, 2); // Assuming Scalar<T>::Scalar(T) is not explicit</code>

Das obige ist der detaillierte Inhalt vonWarum schlägt die Vorlagenableitung bei impliziter Typkonvertierung für benutzerdefinierte Typen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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