Come faccio a passare un generico :: Lista per riferimento?
-
22-08-2019 - |
Domanda
Nel tentativo di avvolgere un certo codice non gestito in un gestita dll che sto cercando di convertire un Generic::List
di punti di dati in un std::vector
. Ecco un frammento di quello che sto cercando di fare:
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
// ...
}
}
}
La compilazione di questo mi dà:
Errore C3699: '&': non è possibile utilizzare questo riferimento indiretto del tipo 'const System :: Collections :: :: Generico List'
Probabilmente ho perso qualcosa di fondamentale qui (io sono relativamente nuovo per modo di .net di fare le cose), ma che si presenta come il codice ragionevolmente valido a me ..?
[Modifica] che ho provato entrambi i suggerimenti Andy e Dario e funzionano, ma come faccio poi accedere ai membri della lista di input? Ho provato tutti i tipi di combinazioni di dreferencing e nulla sembra per compilare:
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;
}
... entrambi mi danno:
Errore C2662: 'System :: Collezioni :: Generico :: :: Lista Count :: get': non può convertire puntatore 'this' da 'Sistema const :: Raccolte :: :: Generico List' a 'System :: collezioni :: :: Generico Lista% '
... così come si fa accedere il riferimento / puntatore?
Soluzione
Come List<T>
è una classe .NET gestito, è passato da gestita GC-handle indicato con ^ e non da C ++ -. Di riferimento
Esempio:
void ListToVec(List<double>^ input_list, std::vector<double>& out)
Non è necessario ulteriore const
qui. Il List<T>^%
notazione crea un riferimento di tracciamento (paragonabile al C ++ - puntatori), piuttosto che una chiamata di riferimento.
Basta accedere ai membri dal list->...
e list[...]
.
Altri suggerimenti
Herb Sutter , %
è il passaggio oggetto gestito dal numero di riferimento. Convertire il codice di seguito, e dovrebbe funzionare:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
// Copy the contents of the input list into the vector
// ...
}
Modifica : Penso che la const
sta causando i problemi, anche se non so perché. Se si modifica l'argomento List
di non essere const
, quindi la prima funzione verrà compilato se si utilizza l'operatore ->
, mentre la seconda funzione verrà compilato se si utilizza l'operatore .
(non sono sicuro del perché esiste questa differenza - doesn' t ha molto senso).
Detto questo, se tutto ciò che si vuole fare è quello di copiare gli elementi nella List
al vector
, allora davvero si vuole utilizzare ^
. Pensare che, come avere un riferimento all'oggetto gestito. Penso che %
sarebbe stato usato se si desidera passare il riferimento "per riferimento" (cioè riassegnare input_list
a qualcos'altro all'interno ListToStdVec()
, e hanno il chiamante vedere il risultato di questo incarico. Tuttavia, dato che si utilizza l'operatore .
per l'accesso membri quando si utilizza %
, che mi dice che non possono comprendere lo scopo di quello affatto.