Comment passer un générique I :: Liste par référence?
-
22-08-2019 - |
Question
Dans une tentative d'envelopper un code non géré dans un GÉRÉ Je .dll essayer de convertir un Generic::List
de points de données dans un std::vector
. Voici un extrait de ce que je suis en train de faire:
namespace ManagedDLL
{
public ref class CppClass
{
void ListToStdVec( const List<double>& input_list, std::vector<double>& output_vector )
{
// Copy the contents of the input list into the vector
// ...
}
void ProcessData( List<double> sampleData )
{
std::vector<double> myVec;
ListToStdVec( sampleData, myVec );
// Now call the unmanaged code with the new vector
// ...
}
}
}
Compiler cela me donne:
Erreur C3699: '&': ne peut pas utiliser ce indirection type 'const System :: Collections :: Generic :: Liste
Je l'ai sans doute manqué quelque chose de fondamental ici (je suis relativement nouveau à la façon de .net de faire les choses), mais qui ressemble à un code raisonnablement valide pour moi ..?
[Modifier] J'ai essayé deux suggestions Andy et Dario et ils travaillent, mais comment puis-je accéder ensuite aux membres de la liste d'entrée? J'ai essayé toutes sortes de combinaisons de dreferencing et rien ne semble compiler:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list->Count;
}
void ListToStdVec( const List<double>^ input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list.Count;
}
... à la fois me donner:
Erreur C2662: 'System :: Collections :: :: Liste générique :: Count :: get': ne peut pas convertir pointeur 'this' de 'système const :: Collections :: :: Liste générique' à « System :: collections génériques :: Liste% '
... alors comment avez-vous accès la référence / pointeur?
La solution
List<T>
est une classe .NET gérée, il est passé par GC-Handle géré notée ^ et non par C ++ -. Référence
Ex:
void ListToVec(List<double>^ input_list, std::vector<double>& out)
Vous n'avez pas besoin const
supplémentaire ici. La List<T>^%
notation crée une référence de suivi (comparable à C ++ - pointeurs) au lieu d'un appel par référence.
Il suffit d'accéder aux membres par list->...
et list[...]
.
Autres conseils
Selon Herb Sutter , %
est le passage de l'objet géré par le caractère de référence. Convertir le code à la suivante, et il devrait fonctionner:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
// Copy the contents of the input list into the vector
// ...
}
Modifier : Je pense que le const
est à l'origine des problèmes, même si je ne sais pas pourquoi. Si vous modifiez l'argument List
de ne pas être const
, la première fonction compilera si vous utilisez l'opérateur ->
, tandis que la seconde fonction compilera si vous utilisez l'opérateur .
(je ne sais pas pourquoi cette différence existe - il n » t beaucoup de sens).
Cela dit, si tout ce que vous voulez faire est de copier les éléments dans le List
au vector
, alors vous voulez vraiment utiliser ^
. Pensez à cela comme ayant une référence à l'objet géré. Je pense que %
serait utilisé si vous voulez passer la référence « par référence » (c.-à réattribuer input_list
à quelque chose d'autre dans les ListToStdVec()
, et ont l'appelant voir le résultat de cette cession. Toutefois, étant donné que vous utilisez l'opérateur .
d'accès membres lors de l'utilisation %
, qui me dit que je ne peux pas comprendre le but de cela.