2010-05-04 11 views
3

J'ai ceci:problème Recursion surcharge un opérateur

typedef string domanin_name; 

Et puis, j'essaie de surcharger l'opérateur < ainsi:

bool operator<(const domain_name & left, const domain_name & right){ 
    int pos_label_left = left.find_last_of('.'); 
    int pos_label_right = right.find_last_of('.'); 

    string label_left = left.substr(pos_label_left); 
    string label_right = right.substr(pos_label_right); 
    int last_pos_label_left=0, last_pos_label_right=0; 

    while(pos_label_left!=string::npos && pos_label_right!=string::npos){ 
     if(label_left<label_right) return true; 
     else if(label_left>label_right) return false; 

     else{ 
      last_pos_label_left = pos_label_left; 
      last_pos_label_right = pos_label_right; 

      pos_label_left = left.find_last_of('.', last_pos_label_left); 
      pos_label_right = right.find_last_of('.', last_pos_label_left); 

      label_left = left.substr(pos_label_left, last_pos_label_left); 
      label_right = right.substr(pos_label_right, last_pos_label_right); 
     } 
    } 
} 

Je sais que c'est une façon étrange de surcharger l'opérateur <, mais je dois le faire de cette façon. Ça devrait faire ce que je veux. Ce n'est pas le propos.

Le problème est qu'il entre dans une boucle infinie droite dans cette ligne:

if(label_left<label_right) return true; 

Il semble que il essaie d'utiliser cette fonction de surcharge lui-même pour faire la comparaison, mais label_left est une chaîne , pas un nom de domaine!

Une suggestion?

Répondre

1

Votre typedef ne crée pas un nouveau type. Il crée simplement un nouveau nom pour faire référence au même type qu'avant. Ainsi, lorsque vous utilisez < dans votre fonction opérateur sur deux chaînes, le compilateur utilise simplement le même opérateur qu'il compile car les types d'arguments correspondent.

Ce que vous pouvez faire est de définir la place une toute nouvelle fonction:

bool domain_less(domain_name const& left, domain_name const& right); 

Ensuite, utilisez cette fonction dans des endroits qui font appel à une fonction de comparaison, comme std::sort. La plupart des algorithmes standard utilisent < par défaut, mais vous permettent de fournir votre propre fonction de prédicat à la place. Vous devrez peut-être utiliser std::ptr_fun pour envelopper votre fonction. Vous pouvez également écrire votre propre objet foncteur; il est typique de descendre de std::binary_function dans ce cas. (Consultez l'en-tête <functional>.)

12

typedef donne juste un autre nom pour un type. Il fait pas créer un type distinct. Donc en effet, vous surchargez operator < pour string.

Si vous voulez créer un type distinct, alors vous pouvez essayer

struct domain_name { 
    string data; 
    // ... 
}; 

et travailler avec cela.

3

Typedef ne fonctionne pas comme ceci. Typedef définit simplement un alias pour le type - c'est toujours une chaîne. Pour ce faire, vous auriez besoin d'un nouveau type à la place. Vous devriez le faire quand même. Votre opérateur surcharge l'opérateur de comparaison pour toutes les chaînes.