Como faço para passar um :: genérico lista por referência?

votos
1

Em uma tentativa de envolver algum código não gerenciado em um gerenciado I .dll estou tentando converter um Generic::Listdos 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
            // ...
        }
    }
}

Compilando isso me dá:

erro C3699: '&': não pode usar este engano no tipo 'const System :: Collections :: Genérico :: List'

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

[Edit] Eu tentei tanto 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 'Sistema :: Coleções :: genéricos :: Lista%'

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

Publicado 19/05/2009 em 17:01
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

De acordo com 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 constestá causando os problemas, embora eu não sei por que. Se você alterar o Listargumento para 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 (não tenho certeza por que existe essa diferença - não faz muito sentido ).

Dito isto, se tudo o que você quer fazer é copiar os elementos do Listao 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, transferir input_listpara outra coisa dentro ListToStdVec(), e têm o chamador ver o resultado desse trabalho. No entanto, uma vez que você usar o .operador para acessar membros ao usar %, que me diz que eu não entenda o propósito de que em tudo.

Respondeu 19/05/2009 em 17:09
fonte usuário

votos
1

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

Ex:

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

Você não precisa adicional constaqui. 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[...].

Respondeu 19/05/2009 em 17:09
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more