كيف يمكنني تمرير 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:'النظام::مجموعات::عام::قائمة::Count::get' :لا يمكن تحويل المؤشر "هذا" من "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()
, ، واطلب من المتصل رؤية نتيجة تلك المهمة.ومع ذلك، نظرًا لاستخدامك .
المشغل للوصول إلى الأعضاء عند الاستخدام %
, ، هذا يخبرني أنني قد لا أفهم الغرض من ذلك على الإطلاق.