Maison > développement back-end > C++ > Pourquoi la déduction des arguments de modèle échoue-t-elle avec les conversions de types implicites en C ?

Pourquoi la déduction des arguments de modèle échoue-t-elle avec les conversions de types implicites en C ?

Barbara Streisand
Libérer: 2024-10-28 07:05:02
original
682 Les gens l'ont consulté

Why Does Template Argument Deduction Fail with Implicit Type Conversions in C  ?

Déduction d'arguments de modèle et conversion de type implicite

En C, la déduction d'arguments de modèle est une fonctionnalité puissante qui détermine automatiquement les types de paramètres de modèle en fonction sur les arguments de l'appelant. Cependant, certains types de conversions ne sont pas pris en compte lors de la déduction, notamment les conversions définies par l'utilisateur.

Problème de conversion implicite

Considérez l'extrait de code suivant :

<code class="cpp">template<typename Dtype>
class Scalar{
    Scalar(Dtype v) : value_(v){}
private:
    Dtype value_;
};</code>
Copier après la connexion

La classe Scalar représente un type de valeur simple. Considérons maintenant la fonction modèle suivante :

<code class="cpp">template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
    cout << "ok" <<endl;
}</code>
Copier après la connexion

Cette fonction prend un int et un Scalar objet comme arguments.

Dans la fonction principale suivante, nous essayons d'appeler func avec un int et une valeur int :

<code class="cpp">int main(){
    int a = 1;
    func(a, 2); // ERROR: template argument deduction fails
    return 0;
}</code>
Copier après la connexion

Mais cela entraîne une erreur de compilation, indiquant que le modèle la déduction des arguments a échoué. En effet, le compilateur ne peut pas convertir automatiquement la valeur int 2 en valeur Scalar objet. Les conversions définies par l'utilisateur, comme Scalar::Scalar(Dtype value), ne sont pas prises en compte lors de la déduction des arguments du modèle.

Solutions possibles

Pour corriger ce problème, vous disposez de plusieurs options :

  • Conversion explicite sur le site de l'appelant :

    <code class="cpp">func(a, Scalar<int>(2));</code>
    Copier après la connexion

    Cela convertit manuellement la valeur int en Scalar< ;int> objet avant de le passer à func.

  • Guide de déduction : (C 17 uniquement)
    Ajouter un guide de déduction pour Scalar :

    <code class="cpp">template<typename T>
    Scalar(T v) -> Scalar<T>;</code>
    Copier après la connexion

    Cela indique au compilateur de préférer ce guide de déduction lors de la déduction du type de scalaire à partir de l'argument de l'appelant, vous permettant d'appeler func comme :

    <code class="cpp">func(a, 2);</code>
    Copier après la connexion
  • Instanciation explicite :
    Vous pouvez explicitement instancier func pour un type spécifique :

    <code class="cpp">func<int>(a, 2);</code>
    Copier après la connexion

    Cela oblige le compilateur à instancier la fonction avec Dtype = int, évitant ainsi le besoin de déduction d'argument de modèle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal