2010-12-03 6 views
2

J'ai une fonction qui doit retourner une liste triée en fonction de certains paramètres d'entrée. J'ai sélectionné un std::priority_queue pour contenir cette liste.Retour d'une file d'attente prioritaire avec un comparateur personnalisé

Mais le compilateur me donne une erreur que je ne reconnais pas. Voici le code que j'ai:

struct DepthCompare { 
    bool operator() 
     (const struct inst *&lhs, const struct inst *&rhs) const 
    { 
     return lhs->depth < rhs->depth; 
    } 
}; 

typedef priority_queue<struct inst*> HeuristicList; 
HeuristicList getHeuristicList(struct BasicBlock &) { 

    HeuristicList ret(DepthCompare); 
    return ret; 
} 

Le compilateur dit qu'un conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested sur la ligne de la déclaration de retour.

Il ne semble pas que j'essaie de retourner un pointeur. Qu'est-ce qui ne va pas?

Répondre

5

Vous avez deux problèmes.

Pour utiliser un comparateur personnalisé, vous devez spécifier le type de comparaison comme troisième argument de modèle:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList; 

HeuristicList ret(DepthCompare); est interprété comme une déclaration de fonction, plutôt que d'une déclaration de variable, donnant l'erreur que vous êtes voyant. Vous devez passer une instance du comparateur, et assurez-vous qu'il ne peut pas être interprété comme une déclaration de fonction:

HeuristicList ret = HeuristicList(DepthCompare()); 

Cependant, depuis le premier argument de la constuctor est facultative, et par défaut à un comparateur par défaut construit, vous pouvez simplement écrire

HeuristicList ret; 

Ou, puisque vous êtes juste retour la variable de suite,

return HeuristicList(); 
+0

Merci. J'ai beaucoup plus de lecture à faire pour comprendre tout cela. Venant de Java, j'ai passé quelques fois des objets anonymes, et je pensais que C++ serait la même chose. Et bien sûr, j'ai omis le corps de 'getHeuristicList()' pour plus de clarté, donc je ne vais pas le retourner immédiatement. J'ai aussi besoin d'un manuel pour interpréter les messages d'erreur gcc! – Mike

0

Notez que le comparateur est le troisième paramètre de modèle de priority_queue. Vous devez déclarer votre priority_queue comme tel:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList; 

Cela suppose que vous souhaitez utiliser vector comme conteneur de support (par défaut).

Notez également que dans votre foncteur de comparateur, vous voulez déclarer les paramètres comme référence constante à un pointeur. Ce que vous avez est une référence à un pointeur vers const. Vous voulez ceci:

bool operator()(inst* const& lhs, inst* const& rhs) const 

Vous n'avez pas besoin de passer une instance de votre objet de comparaison au constructeur priority_queue, comme le constructeur de comparaison par défaut fera très bien.

Questions connexes