2009-04-07 7 views
5

Erreur:
erreur C2678: binaire « == »: aucun opérateur trouvé qui prend un opérande gauche de type « entrée const » (ou il n'y a pas de conversion acceptable)C++ erreur de classe de modèle avec l'opérateur ==

La fonction:

template <class T, int maxSize> 
int indexList<T, maxSize>::search(const T& target) const 
{ 
    for (int i = 0; i < maxSize; i++) 
     if (elements[i] == target) //ERROR??? 
      return i;  // target found at position i 

    // target not found 
    return -1; 
} 

indexList.h
indexList.cpp

est-ce supposé être un opérateur surchargé? Étant un cours de modèle, je ne suis pas sûr de comprendre l'erreur?

Solution- La fonction de surcharge dans la classe maintenant déclarée const:

//Operators 
bool entry::operator == (const entry& dE) const <-- 
{ 
    return (name ==dE.name); 

} 
+0

http://stackoverflow.com/a/38887476/1599699 – Andrew

Répondre

9

Commencez par lire le texte d'erreur exactement comme il est:

binary '==' : no operator found which takes a left-hand operand of type 'const entry'

Cela signifie qu'il ne peut pas trouver un opérateur == qui accepte un type entry comme son opérande gauche. Ce code est incorrect:

entry const e; 
if (e == foo) 

Vous nous avez montré le code de votre classe de liste, mais ce n'est pas ce que l'erreur est sur le point. L'erreur concerne un manque d'opérateurs pour le type entry, quel qu'il soit. Donnez à la classe une fonction operator== ou déclarez une fonction autonome operator== qui accepte un const entry& comme premier paramètre.

struct entry { 
    bool operator==(const entry& other) const; 
}; 
// or 
bool operator==(const entry& lhs, const entry& rhs); 

Je pense que ce dernier est le style préféré.

+0

Merci. Ma classe a surchargé l'opérateur, mais la fonction n'a pas été déclarée const –

6

Le problème fait référence au type T qui est utilisé dans ce cas ne pas avoir un opérateur == défini. Je suppose que d'après votre question, il s'agit d'une «entrée» de classe.

Il se peut aussi que la classe 'entry' n'ait pas l'opérateur == défini correctement pour prendre comme paramètre une entrée const &.

+0

Bingo, peut-être la peine d'expliquer les définitions correctes bien (fonction ami en ligne) ou il pourrait y avoir quelques problèmes de linker * FUN * plus tard = D –

+0

pourquoi les éléments doivent-ils être const? –

+0

Parce que votre méthode de modèle est marquée const. Cela signifie que le compilateur doit vérifier que vous n'appelez pas d'opérations non-const sur les données internes de la classe (élément [i]) –

2

Il est probable que « const empoisonnement », où votre utilisation de const dans la déclaration de votre fonction de recherche vous forcer à ajouter const versions de toutes les fonctions en aval que vous appelez.

Dans une fonction déclarée const, le pointeur this est considéré comme const, ce qui signifie que tous les membres que vous utilisez par ce pointeur sont considérés comme const ainsi. Si votre operator ==() pour le type T avec lequel vous êtes spécialisé ne spécifie pas explicitement les paramètres const, vous obtiendrez cette erreur.

Si vous ne pouvez pas vous assurer que tous les Ts que vous utilisez auront les bons appels operator ==(), je supprimerais les spécificateurs const sur les modèles de fonctions membres.

+0

Dans la classe template l'opérateur == n'est pas défini, doit-il l'être? Quelle est la meilleure façon de supprimer cet empoisonnement const sur cette fonction? –

+0

le terme "const poisoning" est plutôt trompeur. les consts sont là pour vous éviter de faire des erreurs et de vous maintenir dans l'ordre. Si l'ajout d'un const à un endroit signifie que vous devez l'ajouter à d'autres endroits, cela signifie simplement que vous auriez probablement dû le faire auparavant. – shoosh

+0

Je supprimerais simplement le "const" suivant les déclarations dans l'en-tête. Vous pouvez créer un modèle de wrapper activé par const pour l'opérateur ==(), mais cela pose probablement plus de problèmes que cela en vaut la peine. – mwigdahl

1

Le type T que vous utilisez en tant que paramètre de cette classe doit avoir un operator==() puisque le code que vous donnez ne contient pas l'instanciation du modèle, il est difficile de savoir ce qui ne va pas.

Sur une note différente, les définitions de fonction d'un modèle doit être dans le fichier .h ainsi que la classe ou bien le compilateur ne serait pas en mesure d'instancier correctement.

+0

avoir des définitions dans .h –

1

L'opérateur d'égalité pour les types définis par l'utilisateur n'est pas défini par défaut. Cela n'a rien à voir avec votre classe de modèle, mais plutôt avec votre "entrée" struct ou class.

Par conséquent, vous devrez remplacer l'opérateur d'égalité dans struct entry ou class entry.

Sinon, si vous ne voulez pas forcer tout ce qui utilise ce modèle pour définir un opérateur d'égalité, vous pouvez modifier l'interface de modèle pour accepter un Comparator qui fait la comparaison de l'égalité.

0

Parfois, il est tout à fait suffisant pour écrire

... 
    if (target == elements[i]) 
... 
Questions connexes