2010-06-29 3 views
0

Je suis un novice dans l'utilisation des algorithmes STL et je suis actuellement bloqué sur une erreur de syntaxe. Mon objectif global est de filtrer la liste des sources comme si vous utilisiez Linq dans C#. Il peut y avoir d'autres façons de faire cela en C++, mais j'ai besoin de comprendre comment utiliser les algorithmes.Syntaxe pour l'utilisation de la fonction std :: binary_function

Mon objet de fonction définie par l'utilisateur à utiliser comme mon adaptateur de fonction est

struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool> 
{ 
bool operator()(SOURCE_DATA * test, SOURCE_TYPE ref)const 
    { 
    if (ref == SOURCE_All) 
     return true; 
    return test->Value == ref; 
    } 
}; 

Et dans mon programme principal, je l'utilise comme suit: -

typedef std::list<SOURCE_DATA *> LIST; 
LIST; *localList = new LIST;; 
LIST* msg = GLOBAL_DATA->MessageList; 
SOURCE_TYPE _filter_Msgs_Source = SOURCE_TYPE::SOURCE_All; 

std::remove_copy(msg->begin(), msg->end(), localList->begin(), 
    std::bind1st(is_Selected_Source<SOURCE_DATA*, SOURCE_TYPE>(), _filter_Msgs_Source)); 

Ce que je veux la erreur suivante dans Rad Studio 2010. L'erreur signifie "Votre fichier source utilisait un symbole typedef dans lequel une variable devait apparaître dans une expression."

« E2108 Une mauvaise utilisation de typedef « is_Selected_Source » »


Edition - Après avoir fait plus d'expérimentation dans VS2010, qui a un meilleur diagnostic du compilateur, j'ai trouvé le problème est que la définition de remove_copy permet uniquement des fonctions uniary. Je change la fonction en uniary et je l'ai fait fonctionner.

Répondre

0

(Ceci est pertinent que si vous ne l'avez pas omis accidentellement de votre code de la question, et ne peut pas résoudre le problème exact que vous rencontrez)

Vous utilisez is_Selected_Source comme modèle même si vous ne l'avez pas défini comme un. La dernière ligne du deuxième extrait de code doit indiquer std::bind1st(is_Selected_Source() ...

Ou peut-être souhaitez-vous l'utiliser comme modèle, auquel cas vous devez ajouter une déclaration de modèle à la structure.

template<typename SOURCE_DATA, typename SOURCE_TYPE> 
struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool> 
{ 
    // ... 
}; 
+0

Votre réponse initiale a résolu la plupart de mes problèmes, cependant, maintenant je compile - E2034 Impossible de convertir 'const SOURCE_TYPE' en 'SOURCE_DATA *' ​​ –

+0

Peut être plus simple de faire une nouvelle question avec le code révisé et le message d'erreur. Il peut être un peu déroutant quand un seul thread est utilisé pour résoudre plusieurs problèmes sur une période de temps :) – Cogwheel

+0

À première vue, cependant, il semble que vous instanciez la fonction binaire avec les mauvais arguments. Peut-être que vous passez le type de pointeur en paramètre quand vous devriez juste passer le type de base? (le modèle is_Selected_Source gère la conversion en pointeur) – Cogwheel

0

à une estimation (bien que ce n'est qu'une supposition) le problème est que std::remove_copy attend une valeur, mais vous fournir un prédicat. Pour utiliser un prédicat, vous voulez utiliser std::remove_copy_if (et alors vous voudrez écouter la réponse de Cogwheel).

Je voudrais aussi souligner que:

LIST; *localList = new LIST;; 

Attend mal - Je suppose que vous aviez l'intention:

LIST *locallist = new LIST; 

à la place.

Questions connexes