2010-02-02 5 views
0

Je tente simplement d'ajouter une classe FilterInfo à ma collection FilterInfo. Je vais avoir un mal fou à essayer de comprendre pourquoi le code suivant cesse de lancer l'erreur:C++/CLI Je ne peux pas ajouter une classe à ma collection

System::Collections::Generic::List::Add' : cannot convert parameter 1 from 'Ziz::FilterInfo *' to 'Ziz::FilterInfo'

Je ne l'apprentissage C++/CLI, comme je suis un développeur C#, et je suis sûr que c'est quelque chose simple, mais je pourrais certainement utiliser des pointeurs. Mon code dépouillé est la suivante:

 public value class FilterInfo 
    { 
     public: 
      char* Address; 
    }; 

    public ref class Ziz 
    { 
    private: 
     List<FilterInfo>^ _blockList; 

    public: 
     // Constructor 
     Ziz(){ 
      _blockList = gcnew List<FilterInfo>(); 
     } 

     List<FilterInfo>^ GetBlockList() 
     { 

      for each(_IPFILTERINFO ip in _packetFilter->GetBlockList()) 
      { 
       // _IPFILTERINFO is the native C++ struct. 
       FilterInfo* f = new FilterInfo(); 
       _blockList->Add(f); 
      } 
      return _blockList; 
     } 

Répondre

2

Vous avez déclaré que _blockList

List<FilterInfo>^ _blockList; 

mais vous essayez d'ajouter

FilterInfo* f 

à elle. Il ne peut pas fonctionner puisque l'un est un pointeur et l'autre est une référence.

Je ne suis pas sûr de savoir comment la « valeur » s'intègre mais

public value class FilterInfo 
{ 
    public: 
     char* Address; 
}; 

Vous êtes derefore déclarant une classe non gérée pour le rendre géré, vous devez utiliser

public ref class FiterInfo 

Cela permettra Vous pouvez utiliser FilterInfo * sans avoir à gérer la mémoire de manière explicite.

Enfin, char * est pas si grand en C++/CLI, je vous conseille d'utiliser System :: Chaîne

0

Vous devez construire votre FilterInfo avec gcnew ainsi. Vous ne pouvez pas vraiment les mélanger et les écraser ensemble sans marshaling.

0

FilterInfo n'est pas FilterInfo*. Si vous voulez une liste de pointeurs vers FilterInfo, vous devez dire que List<FilterInfo*>. Puisque FilterInfo est une classe de valeur ici bien que vous voudrez probablement juste passer le new.

 FilterInfo fi; 
    _blockList->Add(fi); 
1
_blockList->Add(*f); 
0
public ref class A 

{ };

int main(array<System::String ^> ^args) 
{ 
     Console::WriteLine(L"Hello World"); 
     ICollection<A^>^ oCollection = gcnew List<A^>(); 
     oCollection->Add(gcnew A()); 
     return 0; 
} 
Questions connexes