Как передать Generic::List по ссылке?
-
22-08-2019 - |
Вопрос
Пытаясь обернуть неуправляемый код в управляемую .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()
, и вызывающий объект увидит результат этого назначения.Однако, учитывая, что вы используете .
оператор для доступа к участникам при использовании %
, это говорит мне о том, что я, возможно, вообще не понимаю цели этого.