Maison >développement back-end >C++ >Erreur de compilation C++ : la surcharge du modèle n'est pas valide, comment la résoudre ?

Erreur de compilation C++ : la surcharge du modèle n'est pas valide, comment la résoudre ?

PHPz
PHPzoriginal
2023-08-22 12:49:051307parcourir

Erreur de compilation C++ : la surcharge du modèle nest pas valide, comment la résoudre ?

C++ est un langage de programmation puissant qui est souvent utilisé pour développer diverses applications. Cependant, lors du processus d'écriture de code C++, vous rencontrerez inévitablement divers problèmes, dont le problème de surcharge de modèles non valides. Ce problème, s'il n'est pas traité correctement, entraînera des erreurs de compilation. Alors, comment résoudre ce problème ?

Tout d’abord, nous devons comprendre ce qu’est la surcharge de modèles. En C++, la surcharge de modèles fait référence à la déclaration de plusieurs modèles avec le même nom mais un nombre ou des types de paramètres différents. Lors de l'utilisation d'un modèle de classe ou de fonction avec différents paramètres, le compilateur sélectionne automatiquement le modèle approprié en fonction des types de paramètres définis par le modèle. Cependant, lorsque nous définissons un modèle, si deux modèles ou plus sont définis avec le même type et numéro de paramètre et que le type de retour est également le même, le problème de surcharge de modèle non valide se produira.

Ensuite, examinons quelques problèmes courants de surcharge de modèles non valides et leurs solutions :

  1. Exemple d'erreur 1 :
template <typename T>
void print(T x) {
    cout << "x = " << x << endl;
}

template <typename T>
void print(T* x) {
    cout << "x* = " << *x << endl;
}

int main() {
    int x = 1;
    int* ptr = &x;
    print(x);   // 1
    print(ptr); // Cannot resolve overloaded function 'print' 
    return 0;
}

Dans cet exemple, nous définissons deux modèles avec le même nom mais des paramètres différents Fonction du modèle print est utilisé pour imprimer respectivement les variables et les pointeurs. Cependant, lorsque nous utilisons la fonction print avec un paramètre pointeur, nous obtenons une erreur de compilation. print,分别用于打印变量和指针。然而,在我们使用带有指针参数的print函数时,我们得到了一个编译错误。

这是因为C++编译器需要通过参数类型来确定调用哪个函数模板。在这个例子中,指针也是一种T类型的参数,但与int类型不同。因此,编译器无法确定调用哪个函数,导致模板重载无效。解决这个问题的方法是为指针参数提供一个不同的类型,如下所示:

template <typename T>
void print(T x) {
    cout << "x = " << x << endl;
}

template <typename T>
void print(T* x) {
    cout << "x* = " << *x << endl;
}

template <typename T>
void print(T*& x) { // 指针引用增加参数类型
    cout << "x* = " << *x << endl;
}

int main() {
    int x = 1;
    int* ptr = &x;
    print(x);   // 1
    print(ptr); // x* = 1
    return 0;
}

在这个例子中,我们添加了一个新的模板函数print(T*& x),该函数有一个指针引用参数类型,结果可以成功打印一个指针。

  1. 错误示例2:
template <typename T1,typename T2>
void swap(T1& a, T2& b) {
    T1 temp = a;
    a = b;
    b = temp;
}

template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1,y = 2;
    double d1 = 1.1,d2 = 2.2;
    swap(x,y);
    swap(d1,d2);
    swap(x,d2); // Cannot resolve overloaded function 'swap'
    return 0;
}

在这个例子中,我们定义了两个名字相同但参数不同的模板函数swap,一个用于交换两个不同类型的变量,另一个则用于交换同一类型的变量。然而,在我们交换一个int类型的变量和一个double类型的变量时,我们又得到了一个编译错误。

这是因为在这种情况下,编译器无法根据参数类型区分哪个swap函数应该被调用,导致模板重载无效。为了解决这个问题,我们需要强制指定调用哪个swap函数,如下所示:

template <typename T1,typename T2>
void swap(T1& a, T2& b) {
    T1 temp = a;
    a = b;
    b = temp;
}

template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1,y = 2;
    double d1 = 1.1,d2 = 2.2;
    swap(x,y);
    swap(d1,d2);
    swap<int,double>(x,d2); // 使用模板实参指定调用哪个模板函数
    return 0;
}

在这个例子中,我们在调用swap<int>(x,d2)</int>时,使用了模板实参<int></int>来指定调用哪个swap

En effet, le compilateur C++ doit déterminer quel modèle de fonction appeler via le type de paramètre. Dans cet exemple, le pointeur est également un paramètre de type T, mais pas de type int. Par conséquent, le compilateur ne peut pas déterminer quelle fonction appeler, ce qui rend la surcharge du modèle invalide. La façon de résoudre ce problème est de fournir un type différent pour le paramètre pointeur, comme ceci :

rrreee

Dans cet exemple, nous avons ajouté une nouvelle fonction de modèle print(T*& x), La La fonction a un type de paramètre de référence de pointeur et le résultat peut imprimer avec succès un pointeur.

    Exemple d'erreur 2 : 🎜🎜rrreee🎜Dans cet exemple, nous définissons deux fonctions modèles swap avec le même nom mais des paramètres différents, une pour échanger deux variables de valeurs différentes. types, et l’autre est utilisé pour échanger des variables du même type. Cependant, lorsque nous échangeons une variable de type int avec une variable de type double, nous obtenons une autre erreur de compilation. 🎜🎜En effet, dans ce cas, le compilateur ne peut pas distinguer quelle fonction swap doit être appelée en fonction du type de paramètre, ce qui entraîne une surcharge de modèle non valide. Pour résoudre ce problème, nous devons forcer la spécification quelle fonction swap est appelée, comme indiqué ci-dessous : 🎜rrreee🎜Dans cet exemple, nous appelons swap<int>(x,d2 ) </int>, le paramètre réel du modèle <int></int> est utilisé pour spécifier quelle fonction swap appeler, ce qui résout le problème de surcharge de modèle non valide. 🎜🎜Résumé : 🎜🎜La surcharge de modèles invalides est une erreur courante dans l'écriture C++, généralement causée par des fonctions surchargées avec la même définition mais des paramètres ou des types de retour légèrement différents. Pour éviter ce problème, nous devons fournir différents types de paramètres et types de retour pour chaque fonction de modèle, et utiliser des arguments de modèle pour spécifier la fonction qui doit être appelée. Grâce à ces méthodes, nous pouvons bien résoudre le problème de surcharge de modèles non valides et rendre notre code C++ plus robuste et plus complet. 🎜

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!

Déclaration:
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