1

为了将一些非托管代码包装在托管 .dll 中,我试图将 aGeneric::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 的做事方式相对较新),但这对我来说似乎是合理有效的代码..?

[编辑]我已经尝试了 Andy 和 Dario 的建议并且它们有效,但是我如何访问输入列表的成员?我尝试了各种引用组合,但似乎没有任何编译:

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::通用::列表 %'

...那么您如何访问引用/指针?

4

2 回答 2

2

根据Herb Sutter的说法,%是通过引用字符传递的托管对象。将代码转换为以下内容,它应该可以工作:

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

编辑:我认为const是导致问题的原因,尽管我不确定为什么。如果您将List参数更改为 not const,那么如果您使用运算符,则第一个函数将编译,而如果您使用->运算符,则第二个函数将编译.(我不确定为什么存在这种差异 - 这没有多大意义)。

也就是说,如果您只想将 中的元素复制List到 中vector,那么您真的想使用^. 将其视为对托管对象的引用。我认为%如果您想“通过引用”传递引用(即重新分配input_list给 内的其他内容ListToStdVec(),并让调用者看到该分配的结果,则可以使用它。但是,鉴于您在使用.时使用运算符来访问成员%,这告诉我,我可能根本不明白这样做的目的。

于 2009-05-19T16:09:38.983 回答
1

作为List<T>托管 .NET 类,它由 ^ 表示的托管 GC-Handle 传递,而不是由 C++ 引用传递。

前任:

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

这里不需要额外const的。该符号List<T>^%创建一个跟踪引用(类似于 C++ 指针)而不是按引用调用。只需通过list->...和访问成员list[...]

于 2009-05-19T16:09:19.483 回答