Meilleur auteur de réponses
le bon emploi des délégués

Question
-
Pour pouvoir utilise la fonction Find des methodes de la List pour le code managé voire ci_dessous
j'ai besoin d'utiliser un predicat délégué.
J'ai donc ecrit:
public delegate bool System::Predicate( enPOSM);
et le compilateur me répond
>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique 1> c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate' 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique 1> c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate' 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C3756: 'System::Predicate' : conflits de définitions de délégués avec un symbole existant 1> c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate' 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2063: 'System::Predicate' : n'est pas une fonction
ou trouver un exemple de prédicat délégué?
Jean Noël Martin
Réponses
-
IndexOf renvoie un entier
J'ai donc choisi de procéder en deux temps: l'IndexOf (il retourne -1 quand il n'a rien trouve, sans cela il donne un index) dans le premier temps et le retour true ou false dans le second temps; Ça évite un warning et c'est plus clair Actuellement malgré une deuxième lecture je n'ai pas trouvé la règle pour typer un prédicat.
J'ai simplifié le code du prédicat, mais je n'arrive toujours pas à le compiler: Je donne mon code:
System::Predicate<int>^ CChunker::IsPos( List<enPOSM>^ ListPos, enPOSM var) { int nPosWord; nPosWord = ListPos->IndexOf( var); return( nPosWord); };
et les messages d'erreurs du compilateur
1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(332): error C2440: 'return' : impossible de convertir de 'int' en 'System::Predicate<T> ^' 1> with 1> [ 1> T=int 1> ] 1> Aucun opérateur de conversion défini par l'utilisateur disponible, ou 1> Il n'existe pas de conversion standard de la forme boxed du type arithmétique en type cible 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(344): error C2440: '<function-style-cast>' : impossible de convertir de 'System::Predicate<T> ^' en 'System::Predicate<T>' 1> with 1> [ 1> T=int 1> ] 1> Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë
Je suis toujours à la recherche de la bonne syntaxe.
Jean Noël Martin
finalement la bonne réponse était donné par Paul dans l'autre thread Mais comme celui si est verrouillé je ne peux pas le mettre à résolu
- Marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 02:56
- Non marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 14:42
- Marqué comme réponse JeanNoel53 vendredi 10 janvier 2014 09:51
- Modifié JeanNoel53 vendredi 10 janvier 2014 09:53
Toutes les réponses
-
-
J'ai essayé de coder le corps d'un délégué et je n'ai pas eu de succes
je vous donne mon code et le message du compilateur
public delegate bool System::Predicate( enPOSM var) { List<enPOSM^>::Enumerator itPOS; itPOS->GetEnumerator(); while( itPOS.MoveNext() == true) { if(itPOS.Current == var) return(true); } return(false) };
le compilateur me dit que je n'ai pas une liste de paramètre correct. Quel est donc la liste de paramètre générique qu'il demande?1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique 1> c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate' 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(323): error C2955: 'System::Predicate' : l'utilisation d'une classe Générique requiert une liste d'arguments Générique 1> c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Predicate'
Jean Noël Martin
- Modifié JeanNoel53 dimanche 5 janvier 2014 21:13
-
MAGNIFIQUE :-(((
Les paramètres génériques sont ceux de la classe Syste::Prédicate que vous essayez de, en faite je vois pas, et le compilateur non plus.
C'est quoi ce delegate dans la définition d'une méthode ???
La méthode Predicate de la classe System ??? WTF
Et tout ça pour faire la même chose que la méthode statique "Contains" de la Classe Enumerable :
if(Enumerable.Contains(listeALaCon,VariableALaCon)){...};
MAGNIFIQUE :-(((
Paul Bacelar, Ex - MVP VC++
-
-
if(Enumerable.Contains(listeALaCon,VariableALaCon)){...};
Vous avez juste à donner votre nom de liste (un IEnumerable) et de la variable à trouver à la place des noms fantaisistes (à la con).
Paul Bacelar, Ex - MVP VC++
- Marqué comme réponse JeanNoel53 mardi 7 janvier 2014 02:03
- Non marqué comme réponse JeanNoel53 mardi 7 janvier 2014 02:12
-
j'ai donc essayé
nPosWord = m_ListPosNoun.Find( System::Collections::IEnumerable.Contains( m_ListPosNoun, pWord->POS));
et j'ai le résultat:
1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(347): warning C4832: jeton '.' non conforme après UDT 'System::Collections::IEnumerable' 1> c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : voir la déclaration de 'System::Collections::IEnumerable' 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(347): error C2275: 'System::Collections::IEnumerable' : utilisation non conforme de ce type comme expression 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(347): error C2228: la partie gauche de '.Contains' doit avoir un class/struct/union
Jean Noël Martin
-
nPosWord = m_ListPosNoun->IndexOf(pWord->POS)
Exemple d'utilisation de prédicat :
#include "stdafx.h" using namespace System; using namespace System::Collections::Generic; bool FindString(String^ s) { return s=="Mamenchisaurus"; } private ref class StringPredicate{ String^ SearchTerm; public: StringPredicate(String^ SearchTermIn){ SearchTerm = SearchTermIn; } bool Matched(String^ s){ return s == SearchTerm; } }; int main(array<System::String ^> ^args) { List<String^>^ dinosaurs = gcnew List<String^>(); Console::WriteLine("\nCapacity: {0}", dinosaurs->Capacity); dinosaurs->Add("Tyrannosaurus"); dinosaurs->Add("Amargasaurus"); dinosaurs->Add("Mamenchisaurus"); dinosaurs->Add("Deinonychus"); dinosaurs->Add("Compsognathus"); Console::WriteLine(); for each(String^ dinosaur in dinosaurs ) { Console::WriteLine(dinosaur); } int titi = dinosaurs->IndexOf("Tyrannosaurus"); int tutu = dinosaurs->IndexOf("++Tyrannosaurus"); Console::WriteLine(titi); Console::WriteLine(tutu); String^ toto = dinosaurs->Find(gcnew Predicate<String^>(FindString)); Console::WriteLine(toto); StringPredicate^ findString = gcnew StringPredicate("Amargasaurus"); String^ tyty = dinosaurs->Find(gcnew Predicate<String^>(findString, &StringPredicate::Matched)); Console::WriteLine(tyty); return 0; }
Paul Bacelar, Ex - MVP VC++
- Marqué comme réponse JeanNoel53 mardi 7 janvier 2014 10:50
- Non marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 14:41
-
J'ai donc codé
bool CChunker::IsPos( List<enPOSM>^ ListPos, enPOSM var) { int nPosWord; nPosWord = ListPos->IndexOf( var); if( nPosWord > 0) return( true); else return( false); };
et l'appel du Find
nPosWord = m_ListPosNoun->Find( gcnew( IsPos( m_ListPosNoun, pWord->POS)));
Jean Noël Martin
- Marqué comme réponse JeanNoel53 mardi 7 janvier 2014 11:51
- Non marqué comme réponse Paul BacelarModerator mardi 7 janvier 2014 12:58
-
-
IndexOf renvoie un entier
J'ai donc choisi de procéder en deux temps: l'IndexOf (il retourne -1 quand il n'a rien trouve, sans cela il donne un index) dans le premier temps et le retour true ou false dans le second temps; Ça évite un warning et c'est plus clair Actuellement malgré une deuxième lecture je n'ai pas trouvé la règle pour typer un prédicat.
J'ai simplifié le code du prédicat, mais je n'arrive toujours pas à le compiler: Je donne mon code:
System::Predicate<int>^ CChunker::IsPos( List<enPOSM>^ ListPos, enPOSM var) { int nPosWord; nPosWord = ListPos->IndexOf( var); return( nPosWord); };
et les messages d'erreurs du compilateur
1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(332): error C2440: 'return' : impossible de convertir de 'int' en 'System::Predicate<T> ^' 1> with 1> [ 1> T=int 1> ] 1> Aucun opérateur de conversion défini par l'utilisateur disponible, ou 1> Il n'existe pas de conversion standard de la forme boxed du type arithmétique en type cible 1>..\..\..\..\Linguistic\Analyser\src\chunker.cpp(344): error C2440: '<function-style-cast>' : impossible de convertir de 'System::Predicate<T> ^' en 'System::Predicate<T>' 1> with 1> [ 1> T=int 1> ] 1> Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë
Je suis toujours à la recherche de la bonne syntaxe.
Jean Noël Martin
finalement la bonne réponse était donné par Paul dans l'autre thread Mais comme celui si est verrouillé je ne peux pas le mettre à résolu
- Marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 02:56
- Non marqué comme réponse JeanNoel53 mercredi 8 janvier 2014 14:42
- Marqué comme réponse JeanNoel53 vendredi 10 janvier 2014 09:51
- Modifié JeanNoel53 vendredi 10 janvier 2014 09:53