Frage

In einem Versuch, einige nicht verwalteten Code in eine DLL-Managed zu wickeln Ich versuche, eine Generic::List von Datenpunkten in einem std::vector zu konvertieren. Hier ist ein Ausschnitt von dem, was ich versuche zu tun:

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
            // ...
        }
    }
}

Dieses Kompilieren gibt mir:

  

Fehler C3699: '&': kann nicht diese Indirektion auf Typen verwenden 'const System :: Sammlungen :: Allgemeine :: Liste'

ich wohl hier grundlegend etwas verpaßt habe (ich relativ neu bin auf .net Weg, Dinge zu tun), aber das sieht aus wie vernünftigerweise gültige Code zu mir ..?

[Bearbeiten] Ich habe versucht beide Andy und Dario Vorschläge und sie arbeiten, aber wie kann ich zugreifen dann die Mitglieder der Eingabeliste? Ich habe versucht, alle möglichen Kombinationen von dreferencing und nichts scheint zu kompilieren:

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;
}

... beide geben Sie mir:

  

Fehler C2662: 'System :: Sammlungen :: Allgemeine :: Liste :: Count :: get': nicht konvertieren kann 'diesen' Zeiger von 'const System :: Sammlungen :: Allgemeine :: Liste' auf ‚System :: Sammlungen :: Allgemeine :: Liste%

... so wie greifen Sie den Verweis / Zeiger?

War es hilfreich?

Lösung

Wie List<T> ist eine verwaltete .NET-Klasse, es verwaltet von übergeben wird GC-Handle bezeichnet durch ^ und nicht von C ++ -. Referenz

Beispiel:

void ListToVec(List<double>^ input_list, std::vector<double>& out)

Sie brauchen keine zusätzlichen const hier. Die Notation List<T>^% erzeugt eine Trackingreferenz (vergleichbar mit C ++ - Zeiger), anstatt einen Anruf Bezug genommen wird. Zugang nur die Mitglieder von list->... und list[...].

Andere Tipps

Nach Herb Sutter , % ist das verwaltete Objekt Pass durch das Bezugszeichen. Wandeln Sie den Code auf die folgenden, und es sollte funktionieren:

void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
    // Copy the contents of the input list into the vector
    // ...
}

Bearbeiten : Ich denke, die const die Probleme verursacht, obwohl ich nicht sicher bin, warum. Wenn Sie das List Argument nicht ändern werden const, dann wird die erste Funktion kompilieren, wenn Sie den -> Operator verwenden, während die zweite Funktion kompilieren, wenn Sie den . Operator (ich bin nicht sicher, warum dieser Unterschied existiert - es doesn‘ t viel Sinn machen).

Das heißt, wenn alles, was Sie tun möchten, ist es, die Elemente in der List zum vector kopieren, dann wollen Sie wirklich ^ verwenden. Denken Sie an, dass als einen Verweis auf das verwaltete Objekt besitzt. Ich denke, dass % würde verwendet werden, wenn Sie die Referenz „by reference“ übergeben werden soll (dh input_list auf etwas anderes innerhalb ListToStdVec() neu zuzuweisen, und haben die Anrufer das Ergebnis dieser Zuordnung sehen. Angesichts der Tatsache, dass Sie die . Betreiber Zugriff verwenden Mitglieder, wenn % verwendet, die mir sagt, dass ich nicht den Zweck, das überhaupt verstehen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top