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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top