erreur C2893: impossible de se spécialiser modèle de fonction
J'obtiens cette erreur et une autre erreur de trop ** "IntelliSense: aucune instance de modèle de fonction correspond à la liste des arguments"** lors de la compilation le code suivant
Je sais qu'il pourrait être logique des erreurs dans ma fonction, mais j'ai besoin pour résoudre cette erreur première à être en mesure de débogage de ma fonction .
#include <iostream>
using namespace std;
template<class T>
T myMax (T& arr ,int arrStart ,int arrSize)
{
if(arrStart==arrSize-1)
return arr[arrSize];
int median = (arrStart+arrSize)/2 ;
T left , right , maximum ;
left = max(arr,arrStart , median);
right = max(arr , median+1 , arrSize-1) ;
if (left>right)
maximum = left;
else
maximum = right ;
return maximum ;
}
void main()
{
int arrSize = 5;
int arr[] = {1,3,4,6,22};
int x;
x = myMax(arr,0,arrSize);
}
- Certains autres commentaires, en plus de ceux dans les réponses: Le type de retour de
main
doit êtreint
.arr[arrSize];
est incorrect parce qu'il accède à un élément qui n'existe pas (arr[arrSize]
est un passé la fin du tableau). Puisque la fonction ne modifie pasarr
, si vous choisissez de prendre le tableau par référence, il doit être une référence const.
Vous devez vous connecter pour publier un commentaire.
L'argument pour le paramètre
arr
est de typeint[5]
. Puisque vous n'avez pas spécifier un argument de modèle pourT
lors de l'appel demyMax
, l'argument de la déduction qui se passe etT
est déduit àint[5]
.Puis le compilateur tente de se spécialiser le modèle de fonction avec
T = int[5]
(c'est à dire, il essaie de remplacer toutes les instances deT
avecint[5]
). Il échoue car la fonction renvoie unT
en valeur mais il n'est pas possible de retourner un tableau (commeint[5]
) par valeur.Il semble que vous souhaitez
T
être le type de l'élément. Si c'est le cas, vous pouvez prendre explicitement une référence à un tableau, par exemple,Cependant, une plus idiomatiques façon d'écrire la fonction serait d'avoir à prendre une paire de random access itérateurs et l'ont retourne un itérateur pointant vers le "max" de l'élément:
first
est un itérateur vers le premier élément de la gamme etlast
est un itérateur vers un passé la fin de la gamme, comme c'est idiomatiques pour les algorithmes de la STL. Les pointeurs sont utilisables comme des itérateurs à accès aléatoire, de sorte que cette fonction peut être appelée commeL'avantage de l'itérateur approche est qu'il fonctionne avec n'importe quel random access gamme, y compris un tableau,
std::vector
,std::array
, etstd::deque
.max_element
, qui peut être une bonne idée si l'algorithme a été parallélisé, mais pour un non-parallèles de mise en œuvre n'a pas beaucoup de sens (etmax_element
serait le bon choix).À partir d'un rapide coup d'oeil, les deux choses qui sautent à moi sont:
myMax<int>(...)
) Éditer en tant que Marque B le souligne, ce n'est pas requise, mais