如何通过引用传递Generic :: List?

时间:2009-05-19 16:01:35

标签: c++ .net pass-by-reference argument-passing

尝试在托管的.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:'&amp;' :不能在类型'const System :: Collections :: Generic :: List'

上使用此间接

我可能错过了一些基本的东西(我对.net的做事方式相对较新),但这对我来说看起来是合理有效的代码..?

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

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%'

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

2 个答案:

答案 0 :(得分: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参数更改为const,则在使用->运算符时将编译第一个函数,而如果使用.则第二个函数将编译运算符(我不确定为什么存在这种差异 - 它没有多大意义)。

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

答案 1 :(得分:1)

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

例如:

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

此处您不需要额外的const。符号List<T>^%创建跟踪引用(与C ++ - 指针相当),而不是通过引用调用。 只需按list->...list[...]访问成员。