Вопрос

Пытаясь обернуть неуправляемый код в управляемую .dll, я пытаюсь преобразовать Generic::List точек данных в std::vector.Вот фрагмент того, что я пытаюсь сделать:

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

Компиляция этого дает мне:

ошибка C3699:'&' :нельзя использовать эту косвенность для типа 'const System::Collections::Generic::List'

Я, вероятно, упустил здесь что-то фундаментальное (я относительно новичок в способах ведения дел .net), но мне это кажется достаточно действительным кодом..?

[Редактировать] Я попробовал предложения Энди и Дарио, и они работают, но как мне тогда получить доступ к членам списка ввода?Я пробовал всевозможные комбинации переадресации, и, похоже, ничего не компилируется:

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

... оба дают мне:

ошибка C2662:'System::Collections::Generic::List::Count::get' :невозможно преобразовать указатель «this» из «const System::Collections::Generic::List» в «System::Collections::Generic::List %»

... так как же получить доступ к ссылке/указателю?

Это было полезно?

Решение

Как List<T> — это управляемый класс .NET, он передается с помощью управляемого GC-Handle, обозначенного ^, а не ссылкой на C++.

Бывший:

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

Вам не нужны дополнительные const здесь.Обозначения List<T>^% создает ссылку отслеживания (сравнимую с указателями C++), а не вызов по ссылке.Просто получите доступ к участникам с помощью list->... и list[...].

Другие советы

В соответствии с Херб Саттер, % — это управляемый объект, передаваемый по ссылке.Преобразуйте код в следующий, и он должен работать:

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

Редактировать:я думаю const вызывает проблемы, хотя я не знаю, почему.Если вы измените List аргумент, чтобы не быть const, то первая функция скомпилируется, если вы используете -> оператор, а вторая функция скомпилируется, если вы используете оператор . оператор (я не уверен, почему существует такая разница — это не имеет особого смысла).

Тем не менее, если все, что вы хотите сделать, это скопировать элементы в List к vector, то вы действительно хотите использовать ^.Думайте об этом как о ссылке на управляемый объект.я думаю что % будет использоваться, если вы хотите передать ссылку «по ссылке» (т.е.переназначить input_list к чему-то другому внутри ListToStdVec(), и вызывающий объект увидит результат этого назначения.Однако, учитывая, что вы используете . оператор для доступа к участникам при использовании %, это говорит мне о том, что я, возможно, вообще не понимаю цели этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top