Question

Dans une tentative d'envelopper un code non géré dans un GÉRÉ Je .dll essayer de convertir un Generic::List de points de données dans un std::vector. Voici un extrait de ce que je suis en train de faire:

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

Compiler cela me donne:

  

Erreur C3699: '&': ne peut pas utiliser ce indirection type 'const System :: Collections :: Generic :: Liste

Je l'ai sans doute manqué quelque chose de fondamental ici (je suis relativement nouveau à la façon de .net de faire les choses), mais qui ressemble à un code raisonnablement valide pour moi ..?

[Modifier] J'ai essayé deux suggestions Andy et Dario et ils travaillent, mais comment puis-je accéder ensuite aux membres de la liste d'entrée? J'ai essayé toutes sortes de combinaisons de dreferencing et rien ne semble compiler:

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

... à la fois me donner:

  

Erreur C2662: 'System :: Collections :: :: Liste générique :: Count :: get': ne peut pas convertir pointeur 'this' de 'système const :: Collections :: :: Liste générique' à « System :: collections génériques :: Liste% '

... alors comment avez-vous accès la référence / pointeur?

Était-ce utile?

La solution

List<T> est une classe .NET gérée, il est passé par GC-Handle géré notée ^ et non par C ++ -. Référence

Ex:

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

Vous n'avez pas besoin const supplémentaire ici. La List<T>^% notation crée une référence de suivi (comparable à C ++ - pointeurs) au lieu d'un appel par référence. Il suffit d'accéder aux membres par list->... et list[...].

Autres conseils

Selon Herb Sutter , % est le passage de l'objet géré par le caractère de référence. Convertir le code à la suivante, et il devrait fonctionner:

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

Modifier : Je pense que le const est à l'origine des problèmes, même si je ne sais pas pourquoi. Si vous modifiez l'argument List de ne pas être const, la première fonction compilera si vous utilisez l'opérateur ->, tandis que la seconde fonction compilera si vous utilisez l'opérateur . (je ne sais pas pourquoi cette différence existe - il n » t beaucoup de sens).

Cela dit, si tout ce que vous voulez faire est de copier les éléments dans le List au vector, alors vous voulez vraiment utiliser ^. Pensez à cela comme ayant une référence à l'objet géré. Je pense que % serait utilisé si vous voulez passer la référence « par référence » (c.-à réattribuer input_list à quelque chose d'autre dans les ListToStdVec(), et ont l'appelant voir le résultat de cette cession. Toutefois, étant donné que vous utilisez l'opérateur . d'accès membres lors de l'utilisation %, qui me dit que je ne peux pas comprendre le but de cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top