Pergunta

Em uma tentativa de envolver algum código não gerenciado em um gerenciado .dll Eu estou tentando converter um Generic::List de pontos de dados em um std::vector. Aqui está um trecho do que eu estou tentando fazer:

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

Compilar este dá-me:

Erro C3699: '&': não pode usar este engano no tipo 'const Sistema :: Coleções :: Genérico :: List'

Eu provavelmente esqueceu de algo fundamental aqui (eu sou relativamente novo para o .net maneira de fazer as coisas), mas que se parece com código razoavelmente válida para mim ..?

[Edit] Eu tentei ambas as sugestões de Andy e Dario e eles trabalham, mas como faço para acessar os membros da lista de entrada? Eu tentei todos os tipos de combinações de dreferencing e nada parece compilar:

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

... tanto me dar:

Erro C2662: 'Sistema :: Coleções :: Genérico :: Lista :: Count :: get': não é possível converter 'this' ponteiro da 'const Sistema :: Coleções :: Genérico :: Lista' para 'System :: Coleções :: Genérico :: Lista% '

... assim como você acesse a referência / ponteiro?

Foi útil?

Solução

Como List<T> é uma classe .NET gerenciado, ele é passado pelo conseguiu GC-Handle indicado por ^ e não por C ++ -. De referência

Ex:

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

Você não precisa const adicional aqui. A notação List<T>^% cria uma referência de rastreamento (comparável a C ++ - ponteiros) em vez de uma ligação por referência. Apenas acessar os membros por list->... e list[...].

Outras dicas

De acordo com a Herb Sutter , % é o passe objeto gerenciado pelo caracter de referência. Converter o código para o seguinte e ele deve funcionar:

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

Editar : Eu acho que o const está causando os problemas, embora eu não sei por que. Se você alterar o argumento List a não ser const, em seguida, a primeira função será compilado se você usar o operador ->, enquanto a segunda função será compilado se você usar o operador . (Eu não sei por que existe essa diferença - ele doesn' t faz muito sentido).

Dito isto, se tudo o que você quer fazer é copiar os elementos na List ao vector, então você realmente quer usar ^. Pense nisso como ter uma referência para o objeto gerenciado. Eu acho que % seria usado se você quiser passar a referência "por referência" (ou seja Reassign input_list para outra coisa dentro ListToStdVec(), e ter o chamador ver o resultado desse trabalho. No entanto, uma vez que você usar o operador . ao acesso membros ao usar %, que me diz que eu não entendo o propósito de que em tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top