Heim >Backend-Entwicklung >C++ >Warum schlägt die Ableitung meines C-Vorlagenarguments in nicht abgeleiteten Kontexten fehl?

Warum schlägt die Ableitung meines C-Vorlagenarguments in nicht abgeleiteten Kontexten fehl?

Barbara Streisand
Barbara StreisandOriginal
2024-12-06 09:45:13946Durchsuche

Why Does My C   Template Argument Deduction Fail in Nondeduced Contexts?

Fehler bei der Ableitung von Vorlagenargumenten: Nicht abgeleitete Kontexte verstehen

In Ihrem Code haben Sie zwei Funktionen (temp und temp2) definiert, die dies beabsichtigen Leiten Sie die Vorlagenargumente basierend auf den Parametertypen ab. Es treten jedoch Compilerfehler auf, die besagen, dass diese Argumente nicht abgeleitet werden können.

Das Problem ergibt sich aus der Verwendung des Schlüsselworts „typename“ in den Funktionsdefinitionen:

// Example 1
template <class A>
A temp(typename S<A>::type a1)

// Example 2
template <class A, class B>
B temp2(typename S<A>::type a1, B a2)

Bei Verwendung von Vorlagenparametern , Typname ist erforderlich, um auf abhängige Namen innerhalb der Vorlagenklasse zu verweisen. Dies ist jedoch im Kontext Ihrer Funktionen nicht der Fall, wo S::type einfach ein nicht abhängiger Typ ist.

In C erfolgt der Abzug von Vorlagenargumenten, wenn ein Vorlagenparameter verwendet wird ein Kontext, der seinen Typ bestimmt. In diesem Fall wird der Vorlagenparameter A jedoch in einem nicht abgeleiteten Kontext verwendet, da er nur in der Deklaration eines Referenztyps vorkommt:

typedef typename T& type;

Daher kann der Compiler das Vorlagenargument nicht daraus ableiten der Funktionsaufruf. Um dieses Problem zu beheben, müssen Sie das Vorlagenargument beim Aufruf dieser Funktionen explizit angeben:

temp<char>(c);

Durch die Bereitstellung des expliziten Arguments kann der Compiler die Vorlage korrekt mit dem entsprechenden Typ instanziieren.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Ableitung meines C-Vorlagenarguments in nicht abgeleiteten Kontexten 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