Pregunta

En un intento de incluir código no administrado en un .dll administrado, estoy intentando convertir un Generic::List de puntos de datos en un std::vector.Aquí hay un fragmento de lo que estoy tratando de hacer:

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

Compilando esto me da:

error C3699:'&':no se puede utilizar esta dirección indirecta en el tipo 'const System::Collections::Generic::List'

Probablemente me he perdido algo fundamental aquí (soy relativamente nuevo en la forma de hacer las cosas de .net), pero me parece un código razonablemente válido.?

[Editar] Probé las sugerencias de Andy y Dario y funcionan, pero ¿cómo accedo a los miembros de la lista de entrada?Probé todo tipo de combinaciones de referencias y nada parece compilarse:

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

...ambos me dan:

error C2662:'Sistema::Colecciones::Genérico::Lista::Contar::obtener' :no se puede convertir 'este' puntero de 'const System::Collections::Generic::List' a 'System::Collections::Generic::List %'

... entonces, ¿cómo se accede a la referencia/puntero?

¿Fue útil?

Solución

Como se List<T> una clase .NET administrado, se ha logrado aprobada por GC-Handle denotado por ^ y no por C ++ -. De referencia

Ejemplo:

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

No es necesario const adicional aquí. La notación List<T>^% crea una referencia de seguimiento (comparable a C ++ - punteros) en lugar de una llamada por referencia. Sólo el acceso a los miembros de list->... y list[...].

Otros consejos

Según Herb Sutter , % es el pase de objeto gestionado por el carácter de referencia. Convertir el código a la siguiente, y debería funcionar:

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

Editar : Creo que el const está causando los problemas, aunque no estoy seguro de por qué. Si cambia el argumento List a no ser const, a continuación, la primera función compilará si se utiliza el operador ->, mientras que la segunda función compilará si se utiliza el operador . (No estoy seguro de por qué existe esa diferencia - que doesn' t tiene mucho sentido).

Dicho esto, si todo lo que desea hacer es copiar los elementos en el List a la vector, entonces usted realmente desea utilizar ^. Pensar que por tener una referencia al objeto administrado. Creo que % se utilizaría si quieres pasar la referencia "por referencia" (es decir, reasignar input_list a otra cosa dentro de ListToStdVec(), y tener la persona que llama ver el resultado de esa asignación. Sin embargo, dado que se utiliza el operador . de acceso miembros cuando se utiliza %, que me dice que no puede entender el propósito de eso en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top